ArrayList、LinkedList、Vector的区别
1、List概述
List,就如图名字所示一样,是元素的有序列表。当我们讨论List时,将其与Set作对比是一个很好的办法,Set集合中的元素是无序且唯一的。
下图是Collection的类继承图,从图中你可以对本文所讨论的知识有大致的了解.
2、ArrayList、LinkedList与Vector对比
从上图可以看出三者都继承了List接口。所使用的方法也十分相似。主要的区别在于实现方式的不同,所以对于不同的操作有不同的效率。
ArrayList是一个可变大小的数组,当元素数量达到数组容量上限时,数组的容量会动态的增长,一般为+50%。由于ArrayList本质上是一个数组,所以内部的元素可以get(),set()方法直接访问。
LinkedList是一个双链表,在添加和删除元素时拥有比ArrayList更好地性能,但是在get() , set()方面弱于ArrayList,当然当数据量非常小时,比较便失去了意义。
Vector与arrayList相似,但其是一个强同步类,如果你的程序本身是线程安全的或者说只有一个主线程,没有在多个线程之间共享一个对象,那么请选择ArrayList,他不会让你失望。因为由于要实现强同步,必然承担效率的损耗。
值得注意的是LinkedList还实现了Queue接口,该接口为我们提供了更多的方法,包括offer() , poll() 。
3、ArrayList与LinkList性能比较
测试代码git地址:
JavaBase/per.pb.listText/src/text/ArrayListText.java
/*
* 测试结论总结:当指定下标数据读取,以及列表末端的插入和删除ArrayList要优于LinkedList
* 当非末端的插入和删除时,LinkedList要优于ArrayList
*/
使用小技巧:
1、如果ArrayList的初始容量值特别小,你可以预估数据量的话,尽量给ArrayList或者Vector设置较大的一个初始容量值。这样可以减少空间的开销。
2、ArrayList当元素数量超限时,数组大小会增长50%。Vector则增长100%,所以如果对内存要求较高,可以考虑选择ArrayList。
3、一般建议使用ArrayList,线程问题可以自定义调控。