hashmap 数据结构
java 1.8 之前:
java hashmap 的数据接口 为 数组+链表的接口
java8 以后:
hashmap 做了相关的优化 ,当链表 高度 为8 ,数据长度扩容到64,
链表转成 红黑树,长度低于6红黑树转换为 链表。
concurrentHashMap
map 带排序的集合
TreeMap:
默认按照key 排序的 map集合,底层使用的二叉树,内置比较类对象可以对元素进行排序。
HashSet
看看源码
我们new hashSet 对象的时候实际上创建 一个hashMap
set 集合实际上就是Map 集合 key 部分
所以 hashset 有Map相关的属性。
HashSet是通过HashMap来实现的,HashMap通过hash(key)来确定存储的位置,是不具备存储顺序性的,因此HashSet遍历出的元素也并非按照插入的顺序。
currentHashMap
https://blog.csdn.net/qq_22343483/article/details/98510619
CopyOnRightList
TreeSet
hash冲突
hash 散列函数,就是给出不同长度的值,会存储在固定长度的hash值上面,这个存储值得下标组合就是散列表,hashcode 就是 散列表存储地址
如果hashcode相同,标记着同一个存储地址,这个就是hash 冲突。
hash冲突的处理办法
拉链法:
jdk1.8之前的版本 中的 hashMap 采用就是这种数据结构,具体的实现就是 在hash 冲突产生时,在冲突的的位置增加一个单项链表,将hashcode的值对应的内容存储在那个链表中
开放地址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止
多重哈希法
当出现hash冲突的时候,重新计算,直到找到不冲突的位置
公共溢出法
哈希冲突产生,另创建一张hash表,用来存储hash 冲突的值。