【Java面试题】32 ArrayList和Vector的区别

 

1. Vector & ArrayList 编程

相同点:数组

一、ArrayList和Vector都是继承了相同的父类和实现了相同的接口安全

二、底层都是数组实现的多线程

三、初始默认长度都为10。框架

不一样点:
1)  Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,因为线程的同步必然要影响性能,所以,ArrayList的性能比Vector好。 
2) 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增长50%的大小,这样,ArrayList就有利于节约内存空间。性能

或者这么说:spa

一、Vector是多线程安全的,而ArrayList不是,这个能够从源码中看出,Vector类中的方法不少有synchronized进行修饰,这样就致使了Vector在效率上没法与ArrayList相比;线程

二、两个都是采用的线性连续空间存储元素,可是当空间不足的时候,两个类的增长方式是不一样的,不少网友说Vector增长原来空间的一倍,ArrayList增长原来空间的50%,其实也差很少是这个意思,不过还有一点点问题能够从源码中看出,一下子从源码中分析。对象

三、Vector能够设置增加因子,而ArrayList不能够,最开始看这个的时候,我没理解什么是增量因子,不过经过对比一下两个源码理解了这个,先看看两个类的构造方法:继承

或者能够这么说:

首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,可以维护元素的次序,而且容许元素的重复。3个具体实现类的相关区别以下:

  1. ArrayList是最经常使用的List实现类,内部是经过数组实现的,它容许对元素进行快速随机访问。数组的缺点是每一个元素之间不能有间隔,当数组大小不知足时须要增长存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,须要对数组进行复制、移动、代价比较高。所以,它适合随机查找和遍历,不适合插入和删除。
  2. Vector与ArrayList同样,也是经过数组实现的,不一样的是它支持线程的同步,即某一时刻只有一个线程可以写Vector,避免多线程同时写而引发的不一致性,但实现同步须要很高的花费,所以,访问它比访问ArrayList慢。
  3. LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操做表头和表尾元素,能够看成堆栈、队列和双向队列使用。

     查看Java源代码,发现当数组的大小不够的时候,须要从新创建数组,而后将元素拷贝到新的数组内,ArrayList和Vector的扩展数组的大小不一样。

2. Hashtable & HashMap 
Hashtable和HashMap它们的性能方面的比较相似 Vector和ArrayList,好比Hashtable的方法是同步的,而HashMap的不是。


3. ArrayList & LinkedList

ArrayList的内部实现是基于内部数组Object[],因此从概念上讲,它更象数组,但LinkedList的内部实现是基于一组链接的记录,因此,它更象一个链表结构,因此,它们在性能上有很大的差异: 
       从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的全部数据相应的后移,这样必然要花费较多时间,因此,当你的操做是在一列数据的后面添加数据而不是在前面或中间,而且须要随机地访问其中的元素时,使用ArrayList会提供比较好的性能; 而访问链表中的某个元素时,就必须从链表的一端开始沿着链接方向一个一个元素地去查找,直到找到所需的元素为止,因此,当你的操做是在一列数据的前面或中间添加或删除数据,而且按照顺序访问其中的元素时,就应该使用LinkedList了。 
 

若是在编程中,一、2两种情形交替出现,这时,你能够考虑使用List这样的通用接口,而不用关心具体的实现,在具体的情形下,它的性能由具体的实现来保证。


4. 配置集合类的初始大小     在Java集合框架中的大部分类的大小是能够随着元素个数的增长而相应的增长的,咱们彷佛不用关心它的初始大小,但若是咱们考虑类的性能问题时,就必定要考虑尽量地设置好集合对象的初始大小,这将大大提升代码的性能。     好比,Hashtable缺省的初始大小为101,载入因子为0.75,即若是其中的元素个数超过75个,它就必须增长大小并从新组织元素,因此,若是你知道在建立一个新的Hashtable对象时就知道元素的确切数目如为110,那么,就应将其初始大小设为110/0.75=148,这样,就能够避免从新组织内存并增长大小。

相关文章
相关标签/搜索