首页 > 编程语言 >Java的HashMap

Java的HashMap

时间:2023-03-14 18:56:42浏览次数:39  
标签:hash HashMap 数组 hashCode 链表 Java key table

基于hash值的K-V结构数据容器。

重要计算方法

计算key的hash值

(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)

利用hash计算tab中的位置

p = tab[i = (n - 1) & hash]

数据结构

  • 初始化后HashTable为一个Node<K,V>[] table
  • 随着往里面添加键值对,table数组上可悬挂Node链表。
  • 当Node链表长度binCount >= TREEIFY_THRESHOLD - 1,链表会被转变成红黑树挂在链表上。

原因:应该是从平均查找长度估算,超过了8,用折半查找的效率更好

PUT方法

  1. 计算key的hashCode,并找到table上的位置。
  2. 如果没用发生碰撞则直接放在table上对应位置。
  3. 如果发生碰撞,检查该位置悬挂的是链表还是树
  4. 如果是链表,逐一比较
    • 如果key与某节点的hashCode相同,则覆盖。
    • 链表上未发生碰撞,则添加到链表末尾。如果链表长度>=8,则进行树化。
  5. 如果是树调用putTreeVal(this, tab, hash, key, value)进行查找。
  6. 对数组的扩容检查。

GET方法

  1. 计算key的hashCode,并找到table上的位置。
  2. 检查key值与table上的节点发生碰撞。
  3. 如果未发生碰撞,则根据节点类型,在红黑树或者链表上查找。

重要变化

JDK1.7 数据存储结构为TABLE数组+Entry数组
JDK1.8 数据存储结构为TABLE数组+(Entry数组/红黑树)

历史问题

HashTable的设计理念本就不适合应用于多线程环境中,但是那些面试题强行会提一些问题,就是HashTable的线程安全方面的缺陷。简而言之,HashMap在resize()的时候,头插法多线程无序执行产生循环链表;后面JDK8优化,resize()已经改为尾插法了,避免了死循环的问题,不过还是没解决数据丢失的问题。

标签:hash,HashMap,数组,hashCode,链表,Java,key,table
From: https://www.cnblogs.com/markseven/p/17215950.html

相关文章

  • java变量和常量
    一标识符我们所认识的标识符如:类名HelloWorld标识符的命名规则标识符可以由字母,数字,下划线和和美元符$组成,不能以数字开头标识符严格区分大小写标识符......
  • java实体类之间的转换
    字段相同BeanUtils.copyProperties(item,dto);字段不同通过mapstruct,定义不同的字段名字https://blog.csdn.net/weixin_55806809/article/details/125347999......
  • 平安金服java岗
    电话一面面试官很和蔼,会适度闲聊,奈何本人全程很紧绷,自我介绍之后被安抚别太紧张 ̄□ ̄||1.自我介绍2.最近的一次项目概况,技术难点,怎么攻克的(我自爆代码是网上找的,真无语,一紧张......
  • Java容器之Hashtable源码分析
    一、概述Hashtable是一个比较古老的Map实现类,从它的名称就可以看得出来,因为没有遵循Java的语言规范。它和HashMap很像,同属于散列表,有以下特性:线程安全,这也估计算是唯一......
  • nacos报错 Caused by: com.alibaba.nacos.api.exception.NacosException: java.io.IOE
    麻麻劈,根据这个报错一顿ulimit -n 修改打开文件数,鸡儿报错一直在。 最终修改 vi/etc/sysctl.conf增加三项:fs.inotify.max_queued_events=32768fs.inotify.ma......
  • vscode 中如何运行一个 java 的 hello world
    经常遇到遇到需要运行一些片断性的的代码,比如调试一个函数是否符合预期,在小项目中,又不想写单元测试,就需要一个轻量化的工具,vscode可以轻松胜任。以下内容来自ChatGPT,经本......
  • JavaSE-day02(面向对象:内部类,枚举,泛型)
    一、内部类内部类是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。当一个类的内部,包含一个完整的事物,且......
  • java8 Optional使用 stream filter多级过滤
    java8Optional使用streamfilter多级过滤packagecom.example.core.mydemo.java8;publicclassMyModel{privateStringcouponCode;privateIntegeror......
  • JavaSE-day01(面向对象高级)
    面向对象的核心:设计对象来处理数据,解决问题。一、静态static读作静态,可以用来修饰成员变量,也能修饰成员方法。1.1static修饰成员变量Java中的成员变量按有无static修......
  • JAVA8 lambda中map和flatMap
     lambda中map是对流元素进行转换,flatMap是对流中的元素(集合)进行平铺后合并,即对流中的每个元素平铺后又转换成为了Stream流。 flatMap首先将一个函数应用于元素,然后......