ArrayList和LinkedList区别
1.两者都是List接口的实现类
2.ArrayList基于数组,LinkedList基于链表
3.ArrayList
a.查询快,增删慢
b.往数组尾部添加元素的效率高,也就是调用add(obj),但是还是比LinkedList慢。
4.LinkedList
a.数组添加删除效率高,只需要该变指针指向即可
b.查询数据的平均效率低,需要对链表进行遍历
Arraylist:
底层是基于动态数组,根据下表随机访问数组元素的效率高,向数组尾部添加元素的效率高;
但是,删除数组中的数据以及向数组中间添加数据效率低,因为需要移动数组。
例如最坏的情况是删除第一个数组元素,则需要将第2至第n个数组元素各向前移动一位。
而之所以称为动态数组,是因为Arraylist在要存入的数组元素超过其现有容量的情况下,Arraylist可以进行扩容(
针对JDK1.8 数组扩容后的容量是扩容前的1.5倍),Arraylist源码中最大的数组容量是Integer.MAX_VALUE-8,
对于空出的8位因为是 :
①存储Headerwords;
②避免一些机器内存溢出,减少出错几率,所以少分配
③最大还是能支持到Integer.MAX_VALUE(当Integer.MAX_VALUE-8依旧无法满足需求时)。
只要ArrayList的现有容量足够大,进行add()操作向数组的尾部添加数据的效率还是非常高的;
但是当向数组指定位置添加数据时,会进行大量的数组移动复制操作。
数组复制时,最终将会调用System.arraycopy()方法,add()操作的效率还是相当高。
但是对比LinkedList相比还是后者更有优势,因为LinkedList添加数据只需要改变指针指向即可。
Arraylist删除数组也需要移动数组,效率较慢。
ArrayList和LinkedList的缺点如下:
对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。
对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;
而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。
在ArrayList集合中添加或者删除一个元素时,当前的列表移动元素后面所有的元素都会被移动。
而LinkedList集合中添加或者删除一个元素的开销是固定的。
LinkedList集合不支持 高效的随机随机访问(RandomAccess),因为可能产生二次项的行为。
ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间(8位 最大空间Integer.MAX_VALUE,但是一般预留8位),
而LinkedList的空间花费则体现在它除了头元素与尾元素只具有一个节点,其他元素都具有头节点与尾节点用于存放上个或者下个元素所在的位置。