由put方法深入了解HashMap

这篇具有很好参考价值的文章主要介绍了由put方法深入了解HashMap。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

正文

put方法

public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

当进入put方法中时,首先将键值赋给key和value,再通过key计算出相对应的hash值。再将数据传到putVal方法中。

变量名及方法名代表的意义:

key:键的数据
value:值的数据
putVal:HashMap的实际添加方法
hash():根据key计算出相对应的hash值

putVal方法

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);
        else {
            Node<K,V> e; K k;
            if (p.hash == hash &&
                ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;
            else if (p instanceof TreeNode)
                e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
            else {
                for (int binCount = 0; ; ++binCount) {
                    if ((e = p.next) == null) {
                        p.next = newNode(hash, key, value, null);
                        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);
                        break;
                    }
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        break;
                    p = e;
                }
            }
            if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;
            }
        }
        ++modCount;
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);
        return null;
    }
1 第一次添加数据

首先将table数组赋给tab,判断是否为空或者数组长度为0;因为第一次添加所以进入resize方法中,给tab数组扩展成长度为16的空数组,
再将hash值与索引长度进行与运算得出tab数组的索引值,并将该位置的值赋给P对象,判断p对象是不是一个空串;因为第一次添加,所以添加成功,modCount自增;判断使用的数组是否超过threshold,成立的话将再次扩容返回null

2 非第一次添加数据

首先将table数组赋给tab,判断是否为空或者数组长度为0;由于非第一次添加所以进入下一个判断,将求出来的tab数组中的索引值对象赋给P对象,判断p对象是不是一个空串,失败进入else;先判断hash值是否相同,相同的话再判断key的地址是否相同,或者判断其值非Null的情况下,值是否相同。假如都不成立的情况下,回去判断该链表是不是TreeNode,假如已经树化了,那么向下转型使用TreeNode的添加语句去实现;或者也不属于TreeNode的类型,将判断遍历列表,加入下一个链表为null则将创建一个Node对象指向它,并判断是否构成树化条件,假如成立的话,则进行树化;或者hash值是否相同,相同的话再判断key的地址是否相同,或者判断其值非Null的情况下,值是否相同条件成立,则将e给p,退出循环。再去判断e是否为空,当前面查找到值相同的情况下,会对查到的对象value值进行替换,modCount属性自增,判断使用的数组是否超过threshold,成立的话将再次扩容返回null

变量名及方法名代表的意义作用:

table:HashMap数组的对象
tab:查询比较的Node数组
p:判断数组头结点的Node对象
e:判断链表中的Node对象
k:判断链表中的key值
modCount:用于计算该对象修改过几次
threshold:装载值,判断是否需要扩容文章来源地址https://www.toymoban.com/news/detail-635421.html

到了这里,关于由put方法深入了解HashMap的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)

    List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)

    SpringBoot+Vue3实现登录验证码功能 Java实现发送邮件(定时自动发送邮件) 换个角度使用Redis去解决跨域存取Session问题 Redis缓存穿透、击穿、雪崩问题及解决方法 Spring Cache的使用–快速上手篇 更多该系列文章请查看我的主页哦   根据一些真实需求遇到的问题,需进行排序后

    2024年02月07日
    浏览(11)
  • 深入了解 Java 方法和参数的使用方法

    方法是一块仅在调用时运行的代码。您可以将数据(称为参数)传递到方法中。方法用于执行特定的操作,它们也被称为函数。 重用代码:定义一次代码,多次使用。 提高代码的结构化和可读性。 将代码分解成更小的模块,易于维护和理解。 方法必须在类内声明。它的定义

    2024年02月19日
    浏览(14)
  • 深入了解 大语言模型(LLM)微调方法

    深入了解 大语言模型(LLM)微调方法

    众所周知,大语言模型(LLM)正在飞速发展,各行业都有了自己的大模型。其中,大模型微调技术在此过程中起到了非常关键的作用,它提升了模型的生成效率和适应性,使其能够在多样化的应用场景中发挥更大的价值。 那么,今天这篇文章就带大家深入了解大模型微调。其中

    2024年03月14日
    浏览(21)
  • 深入了解 Postman 请求头的使用方法

    深入了解 Postman 请求头的使用方法

    当你在使用 Postman 发送请求时,请求头(Headers)是你可以包含在 HTTP 请求中的重要部分之一。请求头包含了关于请求的元数据信息,这些信息对于服务器来处理请求是非常重要的。下面是一份详细的图文介绍,说明了如何在 Postman 中使用请求头。 首先,打开 Postman 应用程序

    2024年04月13日
    浏览(10)
  • 深入了解:Java中BigDecimal比较大小的方法

    目录 Java中BigDecimal比较大小的方法 1. ​​compareTo()​​ 2. ​​equals()​​ 3. ​​compareTo()​​ 大家好,今天我想和大家讨论一下Java中BigDecimal类的比较大小的方法。在实际开发中,我们经常会遇到需要比较两个BigDecimal对象的大小的情况,比如排序、判断大小等。但是由于Bi

    2024年02月04日
    浏览(13)
  • 深入了解 Hugging Face 中的生成工具:Generate方法

    深入了解 Hugging Face 中的生成工具:Generate方法

    ❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈 (封面图由文心一格生成) ## 深入了解 Hugging Face 中的生成工具:Generate方

    2023年04月18日
    浏览(12)
  • 由浅入深了解HashMap源码

    由浅入深了解HashMap源码

           由经典面试题引入,讲解一下HashMap的底层数据结构?这个面试题你当然可以只答,HashMap底层的数据结构是由(数组+链表+红黑树)实现的,但是显然面试官不太满意这个答案,毕竟这里有一个坑需要你去填,那就是在回答HashMap的底层数据结构时需要考虑JDK的版本,因

    2023年04月13日
    浏览(18)
  • 进阶JAVA篇-深入了解 Stream 流对象的创建与中间方法、终结方法

    进阶JAVA篇-深入了解 Stream 流对象的创建与中间方法、终结方法

    目录         1.0 Stream 流的说明         2.0 Stream 流对象的创建         2.1 对于 Collection 系列集合创建 Stream 流对象的方式         2.2 对于 Map 系列集合创建 Stream 流对象的方式         2.3 对于数组创建 Stream 流对象的方式         3.0 Stream 流的中间方法      

    2024年02月08日
    浏览(13)
  • 深入了解HTTP 500内部服务器错误的原因及解决方法

    深入了解HTTP 500内部服务器错误的原因及解决方法

    HTTP 状态代码提供有关在线请求是否成功的信息,如果不成功,则错误是什么。 但是错误消息并不总是很清楚。 “500 内部服务器错误”尤其如此。 此消息表示在连接到服务器期间发生错误,并且无法访问所请求的页面。 但是,它不会告诉你为什么会这样。 幸运的是,有不

    2024年02月08日
    浏览(16)
  • 深入解析HashMap

    深入解析HashMap 问题1: 请解释HashMap是什么,以及它的工作原理是什么? 答案: HashMap是Java中常用的集合类之一,用于存储键值对。它基于哈希表(Hash Table)实现,通过将键映射到一个唯一的哈希值,然后将该哈希值映射到数组索引来实现高效的数据访问。当需要插入、查询

    2024年02月07日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包