List集合总结,对比分析ArrayList,Vector,LinkedList
前面已经写了三篇关于Java集合的文章,包括:
关于Vector,它的实现和ArrayList非常类似,就不再单开一个章节来讲了,现在我们来对Java集合做一个归纳总结。
一. List框架图

首先上面的框架图可以表明顺序的关联关系,但并不全面,如ArrayList在继承了AbstractList抽象类的同时还实现了List接口。
- List是一个接口,继承了Collection,同时Collection继承了Iterable,表明List的实现类都是可用迭代遍历的;
- AbstractList是一个抽象类,实现了List接口,同时继承了AbstractCollection,针对一些常用方法,如add(),set(),remove(),给了默认实现,当然在具体的实现类中基本都重写了,该类中没有get(),size()方法。
- AbstractSequentialList是一个抽象类,继承了AbstractList抽象类,实现了很多双向链表中根据索引操作的方法。
- ArrayList、Vector、LinkedList、Stack都是具体的实现类。
二. ArrayList、Vector对比分析
| 类型 | 线程安全 | 内部结构 | 扩容规则 | 执行效率 | 序列化 | |
|---|---|---|---|---|---|---|
| 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、LinkedList对比分析
| 类型 | 内部结构 | 插入效率(正常情况) | 删除效率(正常情况) | 顺序遍历效率 | 随机遍历效率 | 占用内存 | 序列化 |
|---|---|---|---|---|---|---|---|
| ArrayList | 数组Object[] | 低 | 低 | 高 | 高 | 低 | 是 |
| LinkedList | 双向链表Node | 高 | 高 | 高 | 低 | 高 | 是 |
上述的对比都是基于大数据量的情况下,如果只是几个元素或几十个元素,它们之间并没有多大区别。
问:插入效率为何说正常情况下ArrayList低,LinkedList高呢?
答:我们清楚ArrayList之所以插入效率低,有两个原因会造成时间的消耗。
第一,当底层数组空间不足时需要扩容,扩容后需进行数组拷贝
第二,当不在数组末尾插入数据,那么就需要移动数组元素
知道了其插入效率低的原因后,那么很明显,数据扩容及拷贝只有在数组空间不足时才发生,如果我们正确使用,就像《阿里巴巴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的对比分析,若有不对之处,请批评指正,望共同进步,谢谢!
List集合总结,对比分析ArrayList,Vector,LinkedList的更多相关文章
- ArrayList Vector LinkedList(一)
ArrayList Vector LinkedList 区别与用法 ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素, ...
- paip.提升性能---list,arraylist,vector,linkedlist,map的选用..
paip.提升性能---list,arraylist,vector,linkedlist,map的选用.. arraylist,vector基本一样,但是,vector线程安全的. 作者Attilax ...
- 请说出ArrayList,Vector, LinkedList的存储性能和特性
请说出ArrayList,Vector, LinkedList的存储性能和特性 解答:ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都 ...
- 集合中list、ArrayList、LinkedList、Vector的区别、Collection接口的共性方法以及数据结构的总结
List (链表|线性表) 特点: 接口,可存放重复元素,元素存取是有序的,允许在指定位置插入元素,并通过索引来访问元素 1.创建一个用指定可视行数初始化的新滚动列表.默认情况下,不允许进行多项选择. ...
- java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)
说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...
- Java集合源代码剖析(一)【集合框架概述、ArrayList、LinkedList、Vector】
Java集合框架概述 Java集合工具包位于Java.util包下.包括了非常多经常使用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致能够分为例如以下五个部分:List ...
- Java集合系列(二):ArrayList、LinkedList、Vector的使用方法及区别
本篇博客主要讲解List接口的三个实现类ArrayList.LinkedList.Vector的使用方法以及三者之间的区别. 1. ArrayList使用 ArrayList是List接口最常用的实现 ...
- java集合【12】——— ArrayList,LinkedList,Vector的相同点与区别是什么?
目录 特性列举 底层存储结构不同 线程安全性不同 默认的大小不同 扩容机制 迭代器 增删改查的效率 总结一下 要想回答这个问题,可以先把各种都讲特性,然后再从底层存储结构,线程安全,默认大小,扩容机制 ...
- Arraylist Vector Linkedlist区别和用法 (转)
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢 ...
随机推荐
- 主干(trunk)、分支(branch )、标记(tag)
主干(trunk).分支(branch ).标记(tag) 用法示例 + 图解 以svn为例,git的master相当于trunk,dev分支相当于branches --------------- ...
- 【oracle11g,13】表空间管理2:undo表空间管理(调优) ,闪回原理
一.undo空间原理: dml操作会产生undo数据. update时,sever process 会在databuffer 中找到该记录的buffer块,没有就从datafile中找并读入data ...
- Python3获取股票行情数据(中国个股/中国指数/全球指数)
#!/usr/local/bin/python3 #coding=utf-8 #source http://www.cnblogs.com/txw1958/ import os, io, sys, r ...
- OpenGL(七) 光照模型及设置
OpenGL把现实世界中的光照系统近似归为三部分,分别是光源.材质和光照环境. 光源就是光的来源,是"光"这种物质的提供者: 材质是指被光源照射的物体的表面的反射.漫反射(Open ...
- Asp.net-MyFirstMVCProject详细解释
一个URL要求, ASP.NET MVC引擎将分析URL要使用Controller, 这个Controller(取而代之的是,真实的方法Controller的Action)从数据库或者其它数据源获取数 ...
- 本文摘录 - FlumeJava
本文节选不保证论文的完整性和理解的准确性 原始的MapReduce.分Map,Shuffle,Reduce. Map里包含shards. Shuffle理解为groupByKey的事情.Reduce ...
- IIS运行WCF服务报错
试图加载格式不正确的程序 image 解决方法 image HTTP 错误 500.19 image 解决方法在控制面板————>程序————>启用或关闭windows功能—— ...
- 【C#】WixToolset快速入门教程
原文:[C#]WixToolset快速入门教程 介绍 给windows系统做软件,常见的打包工具大家可能都听说过,如:大名鼎鼎的Installshield.Inno setup等.在遇见Wix之前In ...
- thinkphp5 的一些笔记
Model里面的一些属性添加 protected $resultSetType = 'collection'; protected $autoWriteTimestamp = 'timestamp'; ...
- C#如何在VS2015 2017版本中编写WPF UI界面引入第三方SVG图形
原文:C#如何在VS2015 2017版本中编写WPF UI界面引入第三方SVG图形 在VS2015 2017版本中编写WPF UI界面引入第三方SVG图形 最近在写WPF界面的时候遇到一个情 ...