JDK 1.8.0_144 集合框架之HashMap

JDK 1.8.0_144 集合框架之HashMap

1:  Node 的设计   静态内部类,该类是能够被继承的。

JDK 1.8.0_144 集合框架之HashMap

TreeNode 的设计。 静态内部类,使用final修饰标识该类不应该再被继承了。

JDK 1.8.0_144 集合框架之HashMap

 

2: 如何定位一个Node节点位于table(桶)中的Index值。

先对key使用hash函数进行处理。  静态的final方法,该方法不能重写(覆盖)。

JDK 1.8.0_144 集合框架之HashMap

JDK 1.8.0_144 集合框架之HashMap

 

为什么这里不直接使用key.hashCode()返回的数值?

因为这样处理使得高位能参与到运算中来,减少hash冲突。

进行定位 i = (n - 1) & hash ,i 即为该Node在table中的index值。

JDK 1.8.0_144 集合框架之HashMap

因为table的大小为2^n , 而 m %  2^n = m & (2^n - 1)。

如何进行 put 操作

JDK 1.8.0_144 集合框架之HashMap

 

JDK 1.8.0_144 集合框架之HashMap

 

调用构造函数时不会触发回收操作。add等操作能触发回收操作。

JDK 1.8.0_144 集合框架之HashMap

 

3 : tableSizeFor 函数    当 64<cap ≤128 时该函数返回的值为128 。

静态的final 方法,标识该方法不能被重写(覆盖)。

JDK 1.8.0_144 集合框架之HashMap

4: 为什么处理冲突的链表的长度达到8时,会将链表转化为红黑树。

  首先当数量达到8时,红黑树的查找性能高于链表这是毋庸置疑的。

 数量达到8的概率有多大?是否为一个大概率事件?有没有必要进行这样的处理?此处上升为一个概率论问题,并不是我这样低等码农能考虑清楚的事情。在此深表对类库开发者的崇拜之情。

当Tree的数量少于6时又转化为链表。

5: 看似几句话能说明白的原理但编码起来并不容易,基础知识积累不够的根本没法读懂源码更不用谈去编程。所以深层次的编程和底层的编程还是得依靠那些学术界的大牛和聪明的人物来提供可靠高效的代码。

6: 钩子程序

JDK 1.8.0_144 集合框架之HashMap

转载于:https://my.oschina.net/qidis/blog/1503717