【JAVA】集合及底层原理

总览

在这里插入图片描述

list 有索引,允许重复,可以放空(所以可以多个空)
set 没有索引,不允许重复,可以放空(所以一个空)
没有synchronized,线程不安全(执行效率高)
有synchronized,线程安全(执行效率低)

1. ArrayList 与 LinkedList

1.1 ArrayList

数组在这里插入图片描述

1.2 LinkedList

双向链表,双端队在这里插入图片描述
|无参初试为0,第一次扩充为10,再次扩充1.5(old + old>>1)倍 ;有参第一个为你设置的大小,再次扩容为1.5(old + old>>1)倍|无参初试为0,第一次扩充为10,再次扩充(old + old)倍 有参第一个为你设置的大小,再次扩容为(old + old)倍|
|Arrays.copyof扩容|Arrays.copyof扩容|

2. HashMap

数组 链表 红黑树
哈希拉链法

transient HashMap.Node<K, V>[] table;
transient Set<Entry<K, V>> entrySet;

在这里插入图片描述
数组到64 且 链表数量到达8 链表变为红黑树
在这里插入图片描述

插入流程:见源码 putVal方法

  1. table为null 且 length为0扩容到16,设置下次扩容界限
    加载因子(0.75)*大小=扩容界限 ,所以第一次界限为12
  2. 插入
null
not null
一致
不一致
一致
不一致
一致
不一致
一致
YES
NO
下标hash值的数组为null?
直接放入
key一致?equal一致?
插入
树/链表?
key一致?equal一致?
替换
插入
key一致?equal一致?
替换
插入
需要变为树?
不变
  1. node数量,数组方向是否扩容

注:hashtable 等同hashmap 只不过加了锁

3. LinkedHashMap

数组+链表+红黑树+双向链表
原理与HashMap 一致,只是增加了双向链表的数据结果可以维护加入顺序
在这里插入图片描述
同样数组到64 且 链表数量到达8 链表变为红黑树,这里就不画图展示了

4. HashSet

HashSet 底层为 private transient LinkedHashMap<E, Object> map 继承实现,私有构造

    public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }

5. LinkedHashSet

LinkedHashSet 只不过把V固定为object,其余一致LinkedHashMap一致

6. TreeMap

红黑树

7. TreeSet

由TreeMap实现

8. properties

继承hashtable,用于读取配置文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yilyil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值