HashMap

map家族
image

一. HashMap的数据结构:

  1. jdk1.7结构是:数组+链表
  2. jdk1.8结构是:数组+链表+红黑树
    image

二. HashMap性能参数:

  1. 初始容量capacity:创建数组的长度默认是16,如果太少,很容易触发扩容,如果太多,遍历数组会比较慢。
  2. 负载因子loadFactor:一个衡量的尺度,数组长度达到多少的时候触发数组自动扩容,默认是0.75.
  3. 阈值threshold:阈值=容量负载因子,默认160.75=12,当元素数量超过阈值会触发扩容。
  4. 当数组长度达到64,且某个链表的长度大于8,会将某个位置的链表转为红黑树.

三. 多线程条件下HashMap的问题:

1、多线程情况下get和put时,有可能get数据会是null,原因:hashmap在动态扩容时,数据位置发生了变化,导致get数据有可能是null
2、多线程条件下会导致死循环问题,导致CPU100%。
3、多线程put可能会丢失数据。

四. HashMap链表节点过深时为什么选择使用红黑树

  1. 二叉查找树(BST)
    image
    可视化数据结构的网站:https://www.cs.usfca.edu/~galles/visualization/BST.html
    因为二叉查找树在极端情况下可能会变成链表,导致查询效率降低。
  2. 平衡查找二叉树(AVL)
    image
    因为平衡查找二叉树会不断地旋转保持自平衡,会降低hashmap的效率。
  3. 红黑树
    image

五. 红黑树与平衡查找二叉树的区别:

image

六. hash冲突怎么办?

  1. 开放地址法
    简单理解为:冲突之后,在当前位置继续寻找空的位置。
    image
  2. 再hash法
  3. 链地址法:HashMap采用的这种方法:jdk1.7是头插法,1.8是尾插法
    image
posted @ 2025-07-08 16:56  Charlie-Pang  阅读(8)  评论(0)    收藏  举报