集合Map

Map内部关系

Java Map 集合类简介

【关键点】map的hash冲突

Map 处理这些冲突的方法是在索引位置处插入一个链接列表,并简单地将元素添加到此链接列表

HashMap 1.7以前 hash位桶+链表
1.8 hash位桶+链表(8)+ 红黑树

几个 关键值 0.75 2倍扩充 链表与红黑树阈值-8

CurcentHashMap 结构 hashEntry+segment锁结构

segment继承 reentrantLock 具有更好的线程并发 相比 sychronized锁 更为轻量

{———-}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public Object put(Object key, Object value) {
//我们的内部数组是一个 Entry 对象数组
//Entry[] table;

//获取哈希码,并映射到一个索引
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % table.length;

//循环遍历位于 table[index] 处的链接列表,以查明
//我们是否拥有此键项 — 如果拥有,则覆盖它
for (Entry e = table[index] ; e != null ; e = e.next) {
//必须检查键是否相等,原因是不同的键对象
//可能拥有相同的哈希
if ((e.hash == hash) && e.key.equals(key)) {
//这是相同键,覆盖该值
//并从该方法返回 old 值
Object old = e.value;
e.value = value;
return old;
}
}

//仍然在此处,因此它是一个新键,只需添加一个新 Entry
//Entry 对象包含 key 对象、 value 对象、一个整型的 hash、
//和一个指向列表中的下一个 Entry 的 next Entry

//创建一个指向上一个列表开头的新 Entry,
//并将此新 Entry 插入表中
Entry e = new Entry(hash, key, value, table[index]);
table[index] = e;

return null;
}