JDK 1.8 之前 HashMap 由数组 + 链表组成,数组是 HashMap 的主体,链表则是为了解决哈希冲突 (链表散列)
JDK 1.8 之后 HashMap 的组成多了红黑树,当链表长度大于8;HashMap 数组长度超过64,会将链表准换成红黑树,以加快搜索速度。
当链表长度大于8时,首先会调用 treeifyBin() ,它会更具数组来决定是否转化为红黑树。只有当数组的长度 >=64,才会转化成红黑树,否则只会调用 resize() 方法对数组进行扩容。
总结:在jdk1.8 之前,它是一个链表散列结构,即数组 + 链表组成,数组树HashMap的主题,链表是为了解决哈希冲突;jdk1.8之后,当数组长度超过64 且链表长度大于8,则会将链表转成红黑树

hashMap的hash操作

hash() 的操作:将hashCode右移16位,再与其自身异或~ (目的是使hash值更散列)

  1. static final int hash(Object key) {
  2. int h;
  3. // key.hashCode():返回散列值也就是hashcode
  4. // ^ :按位异或
  5. // >>>:无符号右移,忽略符号位,空位都以0补齐
  6. return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
  7. }