当前位置:

ArrayList 和 LinkedList 的真正区别

机器助手 |  2025-07-13
 102人浏览

1、ArrayList 和LinkedList结构不同

可以说ArrayList和LinkedList除了是同属于集合类,其他都是不同的,因为他们本身的实现是两种不同的实现方式,ArrayList 维护的是一个动态数组,LinkedList维护的是一个双向链表,而他们之间的不同是数组与链表的特性比较;

e8d01965ae2b4499b012f7b423a1f5e4

2、效率不同

网上很多说法都比较笼统“ArrayList查询快、LinkedList添加删除快”,经过实践后发现的结论和上面有一点不同;

2.1添加效率

用ArrayList和LinkedList分别插入1000万数据测试,ArrayList 插入1000万数据 4626 毫秒;

LinkedList 插入1000万数据 9546毫秒;


 

public static void main(String[] args) { ArrayList arrayList=new ArrayList(); //ArrayList插入1000万数据记时 long arrayStart=System.currentTimeMillis(); for (int i=0;i<10000000;i++){ arrayList.add(i); } long arrayInsertTime=System.currentTimeMillis()-arrayStart; System.out.println("ArryList插入数据时间:"+arrayInsertTime); }

a4a80218bdbb4b28b38c90ca5a8ef074


 

public static void main·(String[] args) { LinkedList linkedList=new LinkedList(); //LinkedList插入1000万数据记时 long linkedStart=System.currentTimeMillis(); for (int i=0;i<10000000;i++){ linkedList.add(i); } long linkedInsertTime=System.currentTimeMillis()-linkedStart; System.out.println("LinkedList插入数据时间:"+linkedInsertTime); }

67f4cca0c42641d0acbadb1c50badc3c

很明显普通的插入数据ArrayList要比LinkedList要快很多,可为什么普遍的说法是“LinkedList添加删除快”,这里是有前提条件的linkedList在两种情况下插入数据要比ArrayList快:

(1)往集合中间插入数据时ArrayList比linkedList慢

ArrayList往集合中间插入数据要做两个事:把之前的数据挪开赋值到新的数组位置,然后把需要插入的数据插入到数组对应位置;

96e8f4ae97a349fb80488cc82c35211e

LinkedList只要修改对应位置数据before 和last对象的指向就可以了

845bbc826a49432da9cae3d28813bec0

(2)ArrayList正好扩容的时候添加数据要比LinkedList慢

因为ArrayList维护的是一个数组,所以当容量到达阀值时就会进行扩容,然后会重新分配数据的位置,当数组扩容的时候速度也要比LinkedList慢;

0d836e8a6a2b4aaf887cb47adabca1bf

2.2删除数据

AraayList要比LinkedList慢,原理同往集合中间插入数据一样,ArrayList每次删除数据都要对数组重组;

2.3查询数据

ArrayList比LinkedList快;

原理是:ArrayList是数组有下标标记数据位置的,查询时世界返回对应数组下表数据即可;源码如下


 

public E get(int index) { rangeCheck(index); return elementData(index); } //直接反回对应数组下表数据 E elementData(int index) { return (E) elementData[index]; }

LinkedList是链表,没有对数据进行位置标记,每次获取固定位置的数据都需要循环遍历链表如linkedList.get(100),就需要循环100次找到对应的节点返回,源码如下:


 

public E get(int index) { checkElementIndex(index); return node(index).item; } Node<E> node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node<E> x = first; //循环遍历链表找到对应的节点 for (int i = 0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } }

文章评论