527
LinkedHashSet底层是一个LinkedHashMap,
底层维护了一个 数组+双向链表
link代表链表
hashset的子类
LinkedHashSet
根据元素的hashcode值来决定元素的存储位置
维护元素的次序
(使其想顺序插入)
放在了不同的索引上
构建了双向链表
好处:可以有顺序
使其有序
528
Head
Tail
先求hash值、再求索引、确定元素在table的位置、将元素添加到双向链表
插入和遍历数据一样
数组table就是16
存放的结点类型
可以看到这里他们之间有继承关系
存放的数据/元素
Linkedmapentry
Entry
继承了什么,继承关系
entry类型,里面有before 和 after
双向链表
继承关系
内部发生的,继承关系在内部类完成
但可以看到它的索引位置都是不同的
感觉有些像是在嵌套的感觉
529
530
treeset跟后面的差不多
双列
set底层存放的是key与value
利用常量来替代的
由上至下的顺序
Jdk8的map接口特点
Key value
(保存双列元素)
封装到hashmapnode中
静态内部类
value是可以重复的
number不在同一个链表上
等价于替换
大部分用string做key
但是不是一定要用string做key
因为我们经常用key
没有这个说法
New.object也可以
Map.get
传入一个key
含义是什么
通过get方法,传入一个key,
会返回对应得value
使用get方法,得到value
531
追一下源码
Putval
一对k-v,就是entry
key放在set结合
value放在collection放在接口实现子类
Hashmapnode 由set和collection指向
听蒙圈
其他老师讲的很混乱
将其整一个源码来分析
写一段代码
而一个entry对象就有k,v ,EntrySet<Entry<K,V>>
Entryset
key放在set集合
简单的指向
entryset里面放的是一个一个的entry
而entry还是指向node
里面entry是向上转型
定义的类型是一个mapentry,但是实际上存放的还是一个还是hashmap$node
提供了重要的方法
getKey getVal
1.先做一个向下转型
Map.entry
hashmap放在entry
将node - entry - entryse
都是指向node
直观看出指向关系
entry
table表里面的node结点
等于entryset没有什么关系
Set 里面还有一个keyset方法
将其提取出来