前面已经写了三篇关于Java集合的文章,包括:html
关于Vector,它的实现和ArrayList很是相似,就再也不单开一个章节来说了,如今咱们来对Java集合作一个概括总结。框架
首先上面的框架图能够代表顺序的关联关系,但并不全面,如ArrayList在继承了AbstractList抽象类的同时还实现了List接口。函数
类型 | 线程安全 | 内部结构 | 扩容规则 | 执行效率 | 序列化 | |
---|---|---|---|---|---|---|
ArrayList | 否 | 数组Object[] | 10 | 数组足够最小长度*1.5 | 高 | 是 |
Vector | 是 | 数组Object[] | 10 | 默认数组足够最小长度*2,可自定义每次扩容数量 | 低 | 是 |
Vertor扩容方法:大数据
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; //capacityIncrement参数可经过构造函数传递进来,若没传递该参数,则数组大小设置为elementData.length * 2 int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; //扩容有上限 if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity); }
类型 | 内部结构 | 插入效率(正常状况) | 删除效率(正常状况) | 顺序遍历效率 | 随机遍历效率 | 占用内存 | 序列化 |
---|---|---|---|---|---|---|---|
ArrayList | 数组Object[] | 低 | 低 | 高 | 高 | 低 | 是 |
LinkedList | 双向链表Node | 高 | 高 | 高 | 低 | 高 | 是 |
上述的对比都是基于大数据量的状况下,若是只是几个元素或几十个元素,它们之间并无多大区别。线程
问:插入效率为什么说正常状况下ArrayList低,LinkedList高呢?code
答:咱们清楚ArrayList之因此插入效率低,有两个缘由会形成时间的消耗。htm
第一,当底层数组空间不足时须要扩容,扩容后需进行数组拷贝
第二,当不在数组末尾插入数据,那么就须要移动数组元素
知道了其插入效率低的缘由后,那么很明显,数据扩容及拷贝只有在数组空间不足时才发生,若是咱们正确使用,就像《阿里巴巴Java开发手册》中提到咱们在建立集合对象时,就传递参数预先设置好数组大小,那么插入效率是很是高的;而90%的状况下咱们在添加元素时都调用的是add(E e),直接在末尾添加元素,不多调用add(int index, E e)在数组中部添加元素,这样其实移动数组元素就不多发生,所以插入效率也很高。
问:删除效率为什么说正常状况下ArrayList低,LinkedList高呢?
答:由于删除效率高、低不是绝对的。其实删除操做能够分为两部分。
第一:找到要删除的元素,这个经过索引找,ArrayList的执行效率要远高于LinkedList的执行效率;经过equals找则须要遍历整个集合,ArrayList和LinkedList执行效率基本一致。
第二:删除元素及后续操做,这个若是删除是最后一个元素,执行效率基本一致;若是是删除的中间元素,那么ArrayList需进行数组元素移动,而LinkedList只需搭建起该元素的上一个节点和下一个节点的关系便可,LinkedList执行效率高于ArrayList。
所以,需根据实际状况才可判断实际的执行效率。
问:遍历效率这个问题怎么说?
答:ArrayList经过数组实现,自然能够经过数组下标读取数据,顺序遍历、随机遍历效率都很是高;LinkedList经过双向链表实现,顺序遍历时,可直接经过本节点.next()直接找到相关联的下一个节点,效率很高,而若是LinkedList随机遍历时,首先需判断(传递的索引值与集合长度/2)的大小,来肯定接下来是应该从第一个节点开始找仍是最后节点开始找,越是靠近集合中部、集合越大,随机遍历执行效率越低。
本文对List集合进行了总结,包括类结构图,ArrayList和Vector对比分析,ArrayList和LinkedList的对比分析,如有不对之处,请批评指正,望共同进步,谢谢!