java集合ArrayList&LinkedList总结

基于jdk1.8

ArrayList

在这里插入图片描述
如图,ArrayList内部由线性结构数组实现,内部实现数组的动态增长—>源码详解
知识总结

  1. ArrayList内部使用一个数组存储数据,使用一个size变量标记储存了多少个元素。
  2. 数组初始化最小长度为10(为节约空间,ArrayList引入了空数组),支持最大元素为Integer.MAX_VALUE - 8,减8是因为部分JVM创建数组时额外需要8位存储数组长度,当然你可以预定义Integer.MAX_VALUE的大小,但要保障JVM安全。
  3. 它可以存储任一对象,包括null,当向其中添加元素时,会进行动态扩容操作,每次扩容增加的大小为oldCapacity + (oldCapacity >> 1),也就是原来的1.5倍。所以最好使用之前能够估计好元素的数量。
  4. 数组结构保障了ArrayList随机访问能力强,在查找元素,末尾插入\删除元素很快,指定位置插入元素\删除元素需要移动数组。 所以查找操作多推荐使用ArrayList,删除操作多时推荐使用LinkedList。
  5. 继承AccessRandom标记接口,标记for循环遍历元素要快于iterator迭代遍历。
  6. ArrayList非线程安全集合,可通过Collections.synchronizedList()变成线程安全或使用CopyOnWriteArrayList。

LinkedList在这里插入图片描述

如图,LinkedList内部由线性结构双向链表实现—>源码详解
知识点

  1. 链表结构,保障了LinkedList在指定位置删除/插入元素(包括null元素)效率会高于ArrayList,因为不需扩容所和copy元素的成本。
  2. 链表结构保障了LinkedList加入元素个数是无界的。
  3. LinkedList在查找元素时需要从first或last端(计算元素位置离first和last那个更近)开始遍历,效率一般。
  4. LinkedList支持双向队列Deque的支持,所以可以实现队列[FIFO]操作(boolean offer(E e):将元素追加到队列末尾,若添加成功则返回true,poll():从队首删除并返回该元素,peek():返回队首元素,但是不删除),实现栈[FILO]操作(push(E e):将给定元素”压入”栈中, pop():将栈首元素删除并返回)。
  5. LinkedList非线程安全集合,可通过Collections.synchronizedList()变成线程安全。

Vector & CopyOnWriteArrayList

Vector & CopyOnWriteArrayList都是List集合的线程安全版本,内部实现结构通过数组实现,Vector扩容是2倍,并且线程安全是通过synchronized同步方法实现,CopyOnWriteArrayList则是按添加/删除元素个数扩容,也就说每添加/删除一个元素便会重新长生一个新的数组,元素个数siz始终等于object[].length,其线程安全由ReentrantLock保障。



、﹗∕
— 〇 -
╱︱ ヽ
但行好事、莫问前程!
>.freerme[https://blog.csdn.net/freerme]
_________________ *_*______
____ ____ ____
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值