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
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方法
将其提取出来