hashmap1.8特性

参考文章:https://www.freesion.com/article/5619192113/

在JDK8之前是数组+单链表。在JDK8用的是数组+单链表+红黑树。当链表超过8且数据总量超过64才会转红黑树。JDK8规定,当链表长度大于8时,由单链表转化为红黑树;而当链表长度小于6时,又由红黑树转化为单链表)。

loadFactor默认为0.75。

7.HashMap中put方法的过程?

  • 答:“调用哈希函数获取Key对应的hash值,再计算其数组下标;
  • 如果没有出现哈希冲突,则直接放入数组;如果出现哈希冲突,则以链表的方式放在链表后面;
  • 如果链表长度超过阀值( TREEIFY THRESHOLD==8),就把链表转成红黑树,链表长度低于6,就把红黑树转回链表;
  • 如果结点的key已经存在,则替换其value即可;
  • 如果集合中的键值对大于12,调用resize方法进行数组扩容。”

11.jdk8中对HashMap做了哪些改变?

  • java 1.8中,如果链表的长度超过了8,那么链表将转换为红黑树。(桶的数量必须大于64,小于64的时候只会扩容)
  • 发生hash碰撞时,java 1.7 会在链表的头部插入,而java 1.8会在链表的尾部插入
  • java 1.8中,EntryNode替代(换了一个马甲)

1.8之前是头插法。

1.8之后是尾插法。

HashMap的方法不是线程安全的。HashMap在并发执行put操作时发生扩容,可能会导致节点丢失,产生环形链表等情况。

  • 节点丢失,会导致数据不准
  • 生成环形链表,会导致get()方法死循环。

知识拓展

jdk1.7中,由于扩容时使用头插法,在并发时可能会形成环状列表,导致死循环,在jdk1.8中改为尾插法,可以避免这种问题,但是依然避免不了节点丢失的问题。

你可能感兴趣的:(hashmap1.8特性)