您的位置:首页 > 其它

Vector, ArrayList, HashMap 和Hashtable

2010-02-01 11:28 309 查看
首先C#只有Hashtable,Hashtable表示键/值对的集合,这些键/值对根据键的哈希代码进行组织。C#中没有HashMap,而HashMap是Java1.2引进的Map interface的一个实现....

1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;
2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:
Map Collections.synchronizedMap(Map m)
这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。
3.在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断

ArrayList: 使用大小可以按需动态增大的数组来实现IList接口的类,列表中的每个元素都是对象。IList接口中的方法是很少的。

List:是类属类(Generic Class),实现的是强类型的(每个元素都在List类实例化时指定了类型)列表,可以通过索引存取元素,可以排序,提供了比较强大的方法集合。

Hashtable:这个类根据key的值计算hash值,依据hash值来组织key/value这样一对一对的数据。可用来做人名匹配到人的各种属性这样的对照表,key可以重复的。

HashMap:和Hashtable类似,但是key具有唯一性。可用来做例如身份证号匹配到人的各种属性这样的映射表。

ArrayList利于数据查找 因为从ArrayList提取数据的时候它是随机抽取的

如果安全的线程需要用Vector,但是其它地方万万不能用,它耗性能相当的狠

Hashmap是异步的, 线程不需要安全的时候可以用它

Hashtable 反之

都是集合类..
ArrayList 实现List接口 ,随着向 ArrayList 中不断添加元素,其容量也自动增长
Vector向量 不过我是不太喜欢这个类
HashMap实现Map接口--可以说内存就是一个HashMap
HashTable实现一个哈希表,该哈希表将键映射到相应的值
Set一个不包含重复元素的容器
HashMap,HashTable都是KV对形势的

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。

在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;
而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。
那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了,呵呵。

上面是找别人的,我也来补充一下:
vector线程安全
ArrayList非线程安全,但却解约系统性能
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: