ArrayList与LinkedList的底层原理

发布时间 2023-09-02 21:13:31作者: hwj7

ArrayList是Java中常用的List集合,它基于数组来存储和操作数据。以下是ArrayList的底层原理:

  1. 内部数组:ArrayList内部维护一个Object类型的数组来存储元素。初始时,数组的长度为0。当添加元素时,数组会根据需要自动扩容。

  2. 动态扩容:当ArrayList中的元素数量超过当前数组的容量时,ArrayList会创建一个新的更大的数组,并将原数组中的元素复制到新数组中。默认情况下,ArrayList会将数组的大小扩大为当前容量的1.5倍(即增长因子为1.5)。这样做是为了避免每次添加元素时都进行数组的扩容操作,提高性能。

  3. 访问元素:ArrayList通过索引来访问元素。由于底层数组的特性,ArrayList可以通过索引直接访问元素,时间复杂度为O(1)。这使得ArrayList在随机访问元素时效率很高。

  4. 插入和删除元素:当插入或删除元素时,ArrayList需要移动其他元素以保持数组的连续性。如果在数组的中间插入或删除元素,那么后续的元素将会向后或向前移动。这样的操作会导致时间复杂度为O(n),其中n是元素的数量。因此,在需要频繁插入和删除元素的情况下,建议使用LinkedList。

  5. 迭代器:ArrayList提供了迭代器(Iterator)来遍历集合中的元素。迭代器允许按顺序访问集合中的元素,而不需要直接访问底层数组。

 

LinkedList是Java中另一种常用的List集合,它基于链表来存储和操作数据。以下是LinkedList的底层原理:

  1. 节点:LinkedList内部定义了一个Node类作为链表的节点。每个节点包含一个数据元素和指向下一个节点的引用。

  2. 头节点和尾节点:LinkedList维护了头节点(first)和尾节点(last)。头节点是链表的第一个节点,尾节点是链表的最后一个节点。如果链表为空,头节点和尾节点都为null。

  3. 添加元素:当向LinkedList中添加元素时,会创建一个新的节点,并将其添加到链表的尾部。添加元素的时间复杂度为O(1),因为只需要修改尾节点的引用。

  4. 访问元素:由于LinkedList是基于链表的结构,访问元素时需要从头节点开始遍历链表,直到找到目标元素。因此,访问元素的时间复杂度为O(n),其中n是链表的长度。

  5. 插入和删除元素:由于LinkedList是基于链表的结构,插入和删除元素的操作比ArrayList高效。在链表中插入或删除元素时,只需要修改相应节点的引用即可,不需要像数组那样移动其他元素。因此,插入和删除元素的时间复杂度为O(1)。

  6. 迭代器:LinkedList提供了迭代器(Iterator)来遍历集合中的元素。迭代器允许按顺序访问链表中的元素,而不需要直接访问底层的节点。