集合相关的知识点

文章详细介绍了ArrayList的初始化和扩容机制,包括fail-fast和fail-safe的概念及其在ArrayList和CopyOnWriteArrayList中的应用。另外,对比了ArrayList和LinkedList的数据结构和性能特点。最后,讨论了HashMap在Java1.7和1.8中的变化,包括红黑树的使用和树化条件,以及为什么在特定情况下选择链表而非直接使用红黑树。
摘要由CSDN通过智能技术生成
  1. arrayList

arrayList初始化的时候,如果是无参构造器,初始容量是0,如果有参构造初始容量为该参数大小,在无参构造的时候,当add添加元素时,会自动扩容为10,然后继续继续添加直到超过10的时候,会发生扩容,扩容为当前1.5倍,即当前容量+当前容量>>>1。如果按照addAll();进行添加元素的时候,会和自动扩容进行比较,哪个大 就选择哪个为当前list的容量。

2.iterator的fail-fast 和fail-safe

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

fail-fast遍历前,先记录当前list的修改次数mod-count,然后每次遍历都会判断mod-count是否等于当前expectModCount,如果不等,就抛异常。

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

fail-safe遍历前,先把集合中的元素copy到snapshot[]数组中,然后遍历snapshot数组内的元素,就算修改list内数据,也不会影响修改前的遍历结果。

3.LinkedList和ArrayList比较

1.arrayList
  1. 基于数组实现,需要连续内存

  1. 随机访问快(根据下标访问)

  1. 尾部插入,删除性能可以,单是其他部分插入、删除都会移动数据,性能较低

  1. 可以利用cpu缓存,局部性原理

2.LingkedList
  1. 基于双向链表,无需连续内存。

  1. 随机访问慢(需要遍历整个链表)

  1. 头尾插入性能高

  1. 占用内存多

  1. HashMap

  1. 底层数据结构,1.7和1.8有何不同?

1.7底层是数组+链表,而1.8底层是数组+(链表|红黑树)

  1. 在1.8的HashMap中,初始容量是16,扩容因子是0.75,当map中值超过容量*扩容因子,会二倍扩容,直到容量为64时,停止扩容。当总容量=64,且链表长度大于8时才会转换成红黑树。

  1. 为什么要用红黑树?

因为如果链表太长,会导致性能下降。

  1. 何时会树化?

当链表长度大于树化阈值8,且数组长度

  1. 为何不直接用树,而是先用链表?

因为树treenode内存占用逼链表node大,非必要不会转化成树。

用质数可以分布更均匀,用2的n次幂性能高,但是空间差。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值