面经之List

List

目标:

  1. 掌握ArrayList的扩容机制
  2. 掌握Iterator的fail-fast、fail-safe机制

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


一、ArrayList扩容规则(不全)

0、描述

无参的ArrayList的初始容量为0:

ArrayList<Interger> list = new ArrayList<>();
list.add(10);

第一次扩容为长度为10(h)
下一次为上一次长度的1.5倍

h=h+h>>>1

1、扩容机制

在这里插入图片描述

2、fail-fast Vs fail-safe

fail-fast: 一旦发现遍历的同时其他人来修改,则立刻抛异常
==fail-safe:==发现遍历的同时其他人来修改,应当能有应对策略,例如牺牲一致性来让整个遍历运行完成
eg:
CopyOnWriteArrayList: fail-safe
ArrayList:fail-fast

二、LinkedList 与 ArrayList-时间性能对比

1.arraylist

  1. 基于数组的,需要连续内存
  2. 随机访问快(指根据下标访问)
  3. 尾部插入、删除性能可以,其他部分插入、删除都会移动数据,因此性能会低。(要进行复制操作)
  4. 可以利用cpu缓存,局部性原理

2.LinkedList

  1. 基于双向链表的,无需连续内存
  2. 随机访问慢(要沿着链表遍历)
  3. 头尾插入删除性能高。(中间位置不大行)
  4. 占用内存多(Node对象内存大)

3.总结

平均评估,arrayList好一点

三、局部性原理-arraylist具有优势的原因

  1. (arrayList)出于一个假设,在一个变量被访问时,他相邻的变量也有很大几率被访问(所以cpu中缓存一个数据块而不是单个数据)
  2. 链表不能很好的配合cpu缓存和局部性原理来提升性能

总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值