Java集合之ArrayList和LinkedList

1 ArrayList和LinkedList

ArrayListLinkedList是平常经常用到的两种集合

1.1 对于两者的底层

ArrayList的底层是使用的数组,而LinkedList的底层使用双向链表

复制代码
 1 // ArrayList
 2 transient Object[] elementData;
 3 
 4 // LinkedList
 5 transient Node<E> first;
 6 transient Node<E> last;
 7 private static class Node<E> {
 8         E item;
 9         Node<E> next;
10         Node<E> prev;
11 
12         Node(Node<E> prev, E element, Node<E> next) {
13             this.item = element;
14             this.next = next;
15             this.prev = prev;
16         }
17     }
复制代码

 

并且ArrayList实现了RandomAccess,所以其查找数据快,并且从尾部插入数据速度也不错。
而对于LinkedList,向其头部或尾部插入数据快,查找数据(get(index))时,会判断是从尾部还是头部开始查找,但是性能不如ArrayList

 1.2 初始化数组

ArrayList分两种情况,分别是构造函数和添加元素中

构造函数中

ArrayList的构造函数可以无参、指定容量和传入集合。如果你指定了容量>0或者传入了非空集合,这时ArrayList会在执行构造函数时就将其底层数组初始化为你指定的容量或者集合的长度。否则,ArrayList会在你添加元素时再去初始化数组,也就我们所说的懒汉式。

添加元素有两种方法addaddAll(假设数组没有初始化)

add添加一个元素,会直接通过grow创建一个长度为10的数组用以初始化.而addAll传入集合时,如果集合长度小于10,则数组长度为10;否则,数组初始化长度为集合长度。

 对于LinkedList而言,不用过多说明。

ArrayList和LinkedList中用的多一点的是ArrayList,LinkedList由于实现了Deque接口,可以当作栈来使用。

1.3 有关两者的toString方法

实现如下代码

1 List<Integer> arrayList = Arrays.asList(1, 2, 3, 4);
2 System.out.println("arrayList = " + arrayList);
3 
4 LinkedList<Integer> linkedList = new LinkedList<>(arrayList);
5 System.out.println("linkedList = " + linkedList);

 

输出如下
 
两者都没有重写toString方法,最终调用的是AbstractCollection实现的toString。这方面的知识有关动态绑定,这里不过多赘述。
 
 但是两者都有一个问题,线程不安全。这就需要说到CopyOnWriteArrayList 后面再具体讨论。

 

 

 
posted @   lhbili  阅读(45)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示