ArrayList、vector、LinkedList的区别及 内部容器的扩充

来源:互联网 发布:法军 知乎 编辑:程序博客网 时间:2024/05/21 11:24
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!
可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
总结
ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下: 
1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。

3.LinkedList不支持高效的随机元素访问。

4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

ArrayList 和 Vector的区别:
    这两个类都实现了List接口他们都是有序集合,及存储在这两个集合中的元素位置都是有顺序的,相当于 一种动态的数组,我们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的。
    1、同步性:
    Vector是线程安全的,也就是说它的方法之间是线程同步的,而ArrayList是线程不安全的,它的方法之间不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList因为它不考虑线程安全,效率高。如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
    
    2、数据增长:
    ArrayList 与Vector 都有一个初始的容量大小,当存储进他们里面的元素个数超过了容量时,就需要增加ArrayList与Vector的存储空间, 每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取的一定的平衡。Vector默认增加为原来的两倍,而ArrayList默认为 1.5倍,ArrayList和Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而Arraylist 没有设置增长空间的方法。 及Vector增长原来的1倍,Arraylist增长原来的0.5倍