1.ArrayList和LinkedList

1.ArrayList

扩容规则:

  • ArrayList() 会使用长度为零的数组
  • ArrayList(int initialCapacity) 会使用指定容量的数组
  • public ArrayList(Collection<? extends E> c) 会使用 c 的大小作为数组容量
  • add(Object o) 首次扩容为 10,再次扩容为上次容量的 1.5 倍 (ArrayList 的初始长度为0)
  1. 第一次:10
  2. 第二次:10*1.5=15
  3. 第三次:15 >> 1 =7, 7+15=22
  4. 第四次:22 >> 1 =11, 11+22=33
  • addAll(Collection c) 没有元素时,扩容为 Math.max(10, 实际元素个数),有元素时为 Math.max(原容量 1.5 倍, 实际元素个数)
  1. 集合中没有元素时:添加11个元素,扩容为 Math.max(10, 11),扩容为11
  2. 集合中有元素时:有10个元素,通过AddAll方法添加3个元素,扩容为Math.max(10*1.5, 13),扩容15,有10个元素,通过AddAll方法添加6个元素,扩容为Math.max(10*1.5, 16),扩容16

注:二者之间选择一个较大值,作为下次扩容的容量

2. Iterator

什么是Fail-Fast、什么是 Fail-Safe

fail-fast:一旦发现遍历的同时其他人来修改,则立即抛异常 ConcurrentModificationException异常 (并发修改异常)

fail-safe:发现遍历的同时其他人来修改,有响应对策,例如牺牲一致性来让整个遍历运行完成

Fail-Fast 与 Fail-Safe

ArrayList 是 fail-fast 的典型代表,遍历的同时不能修改,尽快失败

Iterator中调用checkForComodification()方法判断是否修改了元素,不等抛出异常

CopyOnWriteArrayList 是 fail-safe 的典型代表,遍历的同时可以修改,原理是读写分离

两个数组,旧数组用来读,新数组用来写.

3. LinkedList

能够说清楚 LinkedList 对比 ArrayList 的区别,并重视纠正部分错误的认知

LinkedList 时间复杂度O(n)

  • 基于双向链表,无需连续内存
  • 随机访问慢(要沿着链表遍历)O(n)
  • 头尾插入删除性能高(从中间插入较慢,需要调用hasNext()定位查找元素地址)
  • 占用内存多

ArrayList 时间复杂度O(n)

  • 基于数组,需要连续内存
  • 随机访问快(指根据下标访问)O(1)
  • 尾部插入、删除性能可以,其它部分插入、删除都会移动数据,因此性能会低(总体来说,ArrayList性能较高,只是头部插入数据较慢)
  • 可以利用 cpu 缓存,局部性原理(读取变量值时,相邻的变量也会被读取)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值