总的思想:
主干数组:无需多解释
哈希计算:根据字节码内存地址计算哈希
key:哈希与数组长度减一位与运算
value:对应存储的值
哈希冲突:这个区别各个帮派的地方;以下个帮派
一、链表法
HashMap
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
}
二、开放寻址(单主干数组,索引i已经有主,i+1继续寻找,终结条件找到null,直接赋值即可。寻找过程中如果非空,一同个key,直接替换value,二、key为null,清理后赋值)
ThreadLocal
private void set(ThreadLocal key, Object value) {
Entry[] tab = table;
int len = tab.length;
int i = key.threadLocalHashCode & (len-1);
for (Entry e = tab[i];
e != null;
e = tab[i = nextIndex(i, len)]) {
ThreadLocal k = e.get();
if (k == key) {
e.value = value;
return;
}
if (k == null) {
replaceStaleEntry(key, value, i);
return;
}
}
tab[i] = new Entry(key, value);
int sz = ++size;
if (!cleanSomeSlots(i, sz) && sz >= threshold)
rehash();
}
private static int nextIndex(int i, int len) {
return ((i + 1 < len) ? i + 1 : 0);
}