关于hashmap

  • HashMap的底层数据结构?

数组加键值对,数组默认都为null,新增是计算key的hash值找到数组的位置保存,下一个如果hash如果已存在,则会形成链表

  • HashMap的存取原理?

新增,key和链表长度hash计算得出数组的位置,存放

取值,key和链表长度hash计算得出数组的位置,如果key相等则返回,否则查询链表。

  • Java7和Java8的区别?

jdk7 使用头插法 ,jdk 8 是尾插法,当链表超过阀值会转换成红黑树

  • 为啥会线程不安全?

如果是1.7使用头插法,同时多个线程进行插入操作,resize会导致循环链表,就是infineloop。

  • 有什么线程安全的类代替么?

concurrenthashmap hashtable

  • 默认初始化大小是多少?为啥是这么多?为啥大小都是2的幂?

16 保证2的幂是确保进行位运算是减少hash冲突,保证链表的均匀分布

  • HashMap的扩容方式?负载因子是多少?为什是这么多?

默认扩张为单前数组的两倍,根据key进行重新hash分布, 0.75 过大会频繁冲突,过小会浪费内存

  • HashMap的主要参数都有哪些?

默认初始化大小,超过会进行resize

最大容器大小

默认的负载因子

转换红黑树的阀值

取消红黑树的阀值,即当链表的数目小于这个数是转化为链表而不是红黑树

MIN_TREEIFY_CAPACITY:链表树化的一个标准,前面说过当数组槽内的元素数量大于8时可能会转化为红黑树,之所以说是可能就是因为这个值,当数组的长度小于这个值是,会先去进行扩容,扩容之后就有很大的可能让数组槽内的数据可以更分散一些了,也就不用转化数组槽后的存储结构了。当然,长度大于这个值并且槽内数据大于8时,那就老老实实的转化为红黑树吧。

  • HashMap是怎么处理hash碰撞的?

根据key值计算索引位置,比较key值,如果相同则覆盖并放回旧值,如果不同则存放于当前节点的下一个链表。

  • hash的计算规则?

key  & (length-1)

原文地址:https://www.cnblogs.com/chenyangwang/p/13386630.html