A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

ArrayList和Vector的区别,HashMap和Hashtable的区别

5 个回复

倒序浏览
就ArrayList 与Vector 主要从二方面来说.
一.同步性:Vector 是线程安全的,也就是说是同步的,而ArrayList 是线程序不安全的,不是
同步的
二.数据增长:当需要增长时,Vector 默认增长为原来一培,而ArrayList 却是原来的一半
就HashMap 与HashTable 主要从三方面来说。
一.历史原因:Hashtable 是基于陈旧的Dictionary 类的,HashMap 是Java 1.2 引进的Map 接口
的一个实现
二.同步性:Hashtable 是线程安全的,也就是说是同步的,而HashMap 是线程序不安全的,
不是同步的
三.值:只有HashMap 可以让你将空值作为一个表的条目的key 或value
回复 使用道具 举报
刘晓康 发表于 2012-3-30 13:56
就ArrayList 与Vector 主要从二方面来说.
一.同步性:Vector 是线程安全的,也就是说是同步的,而ArrayList  ...

谢谢,懂了
回复 使用道具 举报
ArrayList和Vector的区别:
      两个用法差不多,都是实现List接口,区别在于Vector是已同步的,所以效率上比较低一些。一般,在不需要同步时应该使用ArrayList,反之使用Vector。可以看一下文档或源码。 j2se doc上面很清楚,The arraylist class is roughly equivalent to Vector, except that it is unsynchronized. 及多个线程同时使用一个arraylist时,当又一个线程改变了arraylist的内容时
需要用Collections.synchronizedList来同步

Vector类和ArrayList类的主要不同之处在于同步。除了两个只用于串行化的方法,没有一个ArrayList的方法具有同步执行的能力;相反,Vector的大多数方法具有同步能力,或直接或间接。因此,Vector是线程安全的,但ArrayList不是。这使得ArrayList要比Vector快速。对于一些最新的JVM,两个类在速度上的差异可以忽略不计:严格地说,对于这些JVM,这两个类在速度上的差异小于比较这些类性能的测试所显示的时间差异。

通过索引访问和更新元素时,Vector和ArrayList的实现有着卓越的性能,因为不存在除范围检查之外的其他开销。除非内部数组空间耗尽必须进行扩展,否则,向列表的末尾添加元素或者从列表的末尾删除元素时,都同样有着优秀的性能。插入元素和删除元素总是要进行数组复制(当数组先必须进行扩展时,需要两次复制)。被复制元素的数量和[size-index]成比例,即和插入/删除点到集合中最后索引位置之间的距离成比例。对于插入操作,把元素插入到集合最前面(索引0)时性能最差,插入到集合最后面时(最后一个现有元素之后)时性能最好。随着集合规模的增大,数组复制的开销也迅速增加,因为每次插入操作必须复制的元素数量增加了。

只要不需要同步就用ArrayList,事实上ArrayList的存在基本上就是为了淘汰Vector,因为大多数情况下我们只是需要一个动态存储器,而不涉及同步问题。当然,考虑到有可能会有同步的需要以及像以前版本兼容Vector依然本保留下来。

如果需要高效率用ArrayList
如果需要线程安全用Vector

hashtable and hashmap
1. hashtable is synchronized hashmap is not
2. hashmap 的 iterator 是failsafe的 而hashtable 的 enumerator 不是
就是说你初始化了你的hashmap.iterator()以后 如果改变了hashmap的内容
(iterator.remove()除外)iterator 会 throw 一个ConcurrentModificationException
这也是vector.enumerator()和arraylist.iterator()的区别
3. hashmap可以使用null当内容hashtable不行
回复 使用道具 举报
ArrayList和Vector的区别   
     Vector的方法是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
     当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。
     如果涉及到堆栈,队列等操作,应该考虑用Vector,如果需要快速随机访问元素,应该使用ArrayList。
HashMap和Hashtable的区别
     1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
     2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
     3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
     4.HashTable使用Enumeration,HashMap使用Iterator。
     5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
     6.哈希值的使用不同,HashTable直接使用对象的hashCode,而HashMap重新计算hash值,而且用与代替求模。
回复 使用道具 举报
ArrayList和Vector的区别 二者都是java中的集合类,都可以用来存放java对象。区别在于:
1、同步性:Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList是异步的,因此ArrayList中的对象并不是线程安全的。同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样能避免由于同步带来的不必要的性能开销。
2、数据增长:从内部实现机制来讲ArrayList和Vector都是使用数组Array来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度他们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你需要的要大。因此在集合中保存大量的数据Vector有一些优势,可以通过设置集合的初始化大小来避免不必要的资源开销。

HashMap和HashTable的区别二者都是java中的集合类,都可以用来存放java对象。区别在于:历史原因:HashTable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现。
同步性:HashTable是同步的。这个类中的一些方法保证了HashTable中的对象是线程安全的。而HashMap则是异步的,因此HashMap中的对象并不是线程安全的。同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用HashMap是一个很好的选择,这样能避免由于同步带来的不必要的性能开销。
值:HashMap可以让你将空值作为一个表的条目的Key或Value,但是HashTable是是不能放入空值的(null)。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马