diff --git a/2 List/README.md b/2 List/README.md index 9e4b586..35539af 100644 --- a/2 List/README.md +++ b/2 List/README.md @@ -13,6 +13,10 @@ 简单说下编程语言 java, golang中 LinkList的扩缩容的策略。 +java 中扩容,每次扩容新增原先容量的 1/2 +``` + int newCapacity = oldCapacity + (oldCapacity >> 1); +``` ## 双向链表 @@ -30,6 +34,10 @@ typedef struct Entry{ ``` +## 循环链表 + +最后一个节点指针指向头节点的链表 + ## 双向循环链表 diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md index c74444f..1ad0a80 100644 --- a/3 Hash Table/HashMap in Java.md +++ b/3 Hash Table/HashMap in Java.md @@ -19,11 +19,15 @@ java 中 hashmap的实现原理。 public class HashMap extends AbstractMap implements Map, Cloneable, Serializable { + int threshold; //扩容 capacity * load factor + + final float loadFactor; //默认 0.75 + static class Node implements Map.Entry { final int hash; final K key; V value; - Node next; + Node next;//链表结构 ... } @@ -44,22 +48,47 @@ public class HashMap extends AbstractMap return (e = getNode(hash(key), key)) == null ? null : e.value; } + //hash 算法, 根据 key 的 hashCode() 计算而来 + static final int hash(Object key) { + int h; + return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); + } + } ``` + + ## Hash冲突 +HashMap是怎么处理hash碰撞的? + + ## 扩容 +初始化容量, 默认结果是 16 + +``` +static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16, 为啥用位运算呢?直接写16不好么? +``` + + +HashMap的扩容方式? 负载因子是多少? 为什是这么多? + +HashMap 中 `final float ` , loadFactor 默认 0.75 , 也就是达到容量的 75%时就会开始扩容。那么问题来了,扩容到多达? 扩容后元素怎么重排到新的容器中,直接复制拷贝可以吗? + ## 问题 +### 链表上使用的头插还是尾插方式? +### 多线程下死循环问题 +