广告
返回顶部
首页 > 资讯 > 精选 >Java怎么根据key值修改Hashmap中的value值
  • 700
分享到

Java怎么根据key值修改Hashmap中的value值

2023-07-05 15:07:28 700人浏览 泡泡鱼
摘要

这篇文章主要讲解了“Java怎么根据key值修改HashMap中的value值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么根据key值修改Hashmap中的value值”吧!根

这篇文章主要讲解了“Java怎么根据key值修改HashMap中的value值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么根据key值修改Hashmap中的value值”吧!

    根据key值修改Hashmap的value值

    如果原来map中没有key,会创建,如果原来有key,会使用value 覆盖掉原来的值

    map.put(key,value);

    这个实现对原值加一(前提是有这个key)

    map.put(key,map.get(key)+1);

    以下可以获取key对应的value,如果没有可以返回默认的value

    map.getOrDefault(key,value);

    HashMap的key更改后能否正确获取value?

    在HashMap 中存放的一系列键值对,其中键为某个我们自定义的类型。放入 HashMap 后,我们在外部把某一个 key 的属性进行更改,然后我们再用这个 key 从 HashMap 里取出元素,这时候 HashMap 会返回什么?

    我们办公室几个人答案都不一致,有的说返回null,有的说能正常返回value。但不论答案是什么都没有确凿的理由。我觉得这个问题挺有意思的,就写了代码测试。结果是返回null。需要说明的是我们自定义的类重写了 hashCode 方法。我想这个结果还是有点意外的,因为我们知道 HashMap 存放的是引用类型,我们在外面把 key 更新了,那也就是说 HashMap 里面的 key 也更新了,也就是这个 key 的 hashCode 返回值也会发生变化。这个时候 key 的 hashCode 和 HashMap 对于元素的 hashCode 肯定一样,equals也肯定返回true,因为本来就是同一个对象,那为什么不能返回正确的值呢?

    测试案例

    这里有 2 个案例,一个是 Person 类,还有一个是 Student 类,我们来验证下以上的观点(附带结论):

    • 修改了对象属性是否会改变它的 hashcode => 是的

    • 在 HashMap 里存取的时候是否会受到修改属性影响取值 => 取值为 null

    package tech.luxsun.interview.luxinterviewstarter.collection; import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.util.HashMap; public class MapDemo0 {     public static void main(String[] args) {        HashMap<Object, Object> map = new HashMap<>();         // Person Case        Person p = new Person("Bob", 12);        map.put(p, "person");        System.out.println(p.hashCode());        System.out.println(map.get(p));         p.setAge(13);        System.out.println(p.hashCode());        System.out.println(map.get(p));         // Student Case        Student stu = new Student("Bob", 12);        map.put(stu, "student");        System.out.println(stu.hashCode());        System.out.println(map.get(stu));         stu.setAge(13);        System.out.println(stu.hashCode());        System.out.println(map.get(stu));    }} @Data@AllArgsConstructor@NoArgsConstructorclass Person {    private String name;    private Integer age;     public int hashCode() {        return 123456;    }} @Data@AllArgsConstructor@NoArgsConstructorclass Student {    private String name;    private Integer age;}

    输出结果

    123456
    person
    123456
    person
    71154
    student
    71213
    null

    源码

    hashCode 源码

    public int hashCode() {    int PRIME = true;    int result = 1;    Object $age = this.getAge();    int result = result * 59 + ($age == null ? 43 : $age.hashCode());    Object $name = this.getName();    result = result * 59 + ($name == null ? 43 : $name.hashCode());    return result;}

    map.get 源码

    public V get(Object key) {    node<K,V> e;    return (e = getNode(hash(key), key)) == null ? null : e.value;}  static final int hash(Object key) {    int h;    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);} final Node<K,V> getNode(int hash, Object key) {    Node<K,V>[] tab; Node<K,V> first, e; int n; K k;    if ((tab = table) != null && (n = tab.length) > 0 &&        (first = tab[(n - 1) & hash]) != null) {        if (first.hash == hash && // always check first node            ((k = first.key) == key || (key != null && key.equals(k))))            return first;        if ((e = first.next) != null) {            if (first instanceof TreeNode)                return ((TreeNode<K,V>)first).getTreeNode(hash, key);            do {                if (e.hash == hash &&                    ((k = e.key) == key || (key != null && key.equals(k))))                    return e;            } while ((e = e.next) != null);        }    }    return null;}

    总之

    可以看到先取得了一个table,这个table实际上是个数组。然后在table里面找对应 key 的value。找的标准就是hash等于传入参数的hash, 并且满足另外两个条件之一:k = e.key,也就是说他们是同一个对象,或者传入的 key 的equal目标的 key 。我们的问题出在那个hash(key.hashCode()),可以看到 HashMap 在存储元素时是把 key 的 hashCode 再做了一次hash。得到的hash将最终作为元素存储位置的依据。对应到我们的情况:第一次存储时,hash函数采用key.hashCode作为参数得到了一个值,然后根据这个值把元素存到了某个位置。

    当我们再去取元素的时候,key.hashCode的值已经出现了变化,所以这里的hash函数结果也发生了变化,所以当它尝试去获得这个 key 的存储位置时就不能得到正确的值,导致最终找不到目标元素。要想能正确返回,很简单,把Person类的 hashCode 方法改一下,让它的 hashCode 不依赖我们要修改的属性,但实际开发中肯定不能这么干,我们总是希望当两个对象的属性不完全相同时能返回不同的 hashCode 值。

    所以结论就是当把对象放到 HashMap 后,不要去修改 key 的属性,除非你重写了该实体类的 hashCode 方法不受属性限制。

    感谢各位的阅读,以上就是“Java怎么根据key值修改Hashmap中的value值”的内容了,经过本文的学习后,相信大家对Java怎么根据key值修改Hashmap中的value值这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: Java怎么根据key值修改Hashmap中的value值

    本文链接: https://www.lsjlt.com/news/352725.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Java怎么根据key值修改Hashmap中的value值
      这篇文章主要讲解了“Java怎么根据key值修改Hashmap中的value值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么根据key值修改Hashmap中的value值”吧!根...
      99+
      2023-07-05
    • Java如何根据key值修改Hashmap中的value值
      目录根据key值修改Hashmap的value值HashMap的key更改后能否正确获取value?测试案例总之最后根据key值修改Hashmap的value值 如果原来map中没有...
      99+
      2023-03-22
      Java key值 Java修改Hashmap的value值 Java Hashmap value值
    • python怎么根据key获取value值
      在Python中,可以使用字典(dict)来存储键值对,然后根据键(key)获取相应的值(value)。可以使用以下方法来根据键获取...
      99+
      2023-08-19
      python
    • 如何在java中使用enum根据value值获取key键
      这篇文章主要介绍了如何在java中使用enum根据value值获取key键,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的...
      99+
      2023-06-06
    • sql怎么根据条件修改字段值
      要根据条件修改字段值,您可以使用UPDATE语句来更新数据库中的记录。以下是一个示例:```sqlUPDATE 表名SET 字段名 ...
      99+
      2023-09-09
      sql
    • java怎么修改注解的值
      要修改注解的值,可以使用反射来获取注解的信息,并通过反射修改注解的属性值。 首先,需要获取被注解的类或方法的对象,然后通过Class...
      99+
      2023-10-24
      java
    • java怎么修改list中对象的值
      要修改List中的对象值,可以通过索引访问特定的对象,然后修改该对象的属性。下面是一个示例代码:```javaimport java...
      99+
      2023-08-15
      java list
    • java怎么动态修改注解的值
      在Java中,注解的值通常是在编译时确定的,因此在运行时动态修改注解的值是不容易实现的。但是,可以通过使用反射来实现动态修改注解的值...
      99+
      2023-09-26
      java
    • mysql中的默认值怎么修改
      要修改MySQL中的默认值,可以使用ALTER TABLE语句。以下是一个示例:```ALTER TABLE table_name ...
      99+
      2023-09-05
      mysql
    • python中怎么修改列表中的值
      要修改列表中的值,可以通过索引来访问列表中的元素,并进行赋值操作。例如,假设有一个列表my_list,想要将第一个元素修改为"new...
      99+
      2023-10-18
      python
    • php怎么修改数组中的键值
      这篇文章主要介绍“php怎么修改数组中的键值”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php怎么修改数组中的键值”文章能帮助大家解决问题。一、使用array_combine()和array_ke...
      99+
      2023-07-05
    • python怎么修改list中对象的值
      要修改Python中列表中对象的值,可以使用索引和赋值操作符来实现。下面是一个示例:```python# 创建一个包含对象的列表my...
      99+
      2023-08-18
      python list
    • MySql Update修改(替换)某个字段中包含的某个值,根据条件修改替换某个字段的一部分值
      背景: 由于数据迁移和域名变更,Mysql中存储的文件下载地址变更; 要替换某一个字段中的部分内容,可以用update 语句和REPLACE方法,结构如下: UPDATE 表名 SET 字段名= REPLACE( 需要替换值的字段名...
      99+
      2023-08-31
      mysql 数据库 java Powered by 金山文档
    • 怎么修改数据库字段的默认值
      要修改数据库字段的默认值,可以使用ALTER TABLE语句。下面是一个示例: ALTER TABLE table_name ALT...
      99+
      2023-10-28
      数据库
    • 怎么使用Java计算修改文件的MD5值
      这篇文章主要讲解了“怎么使用Java计算修改文件的MD5值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Java计算修改文件的MD5值”吧!什么是 MD5 ?MD5(Message ...
      99+
      2023-07-05
    • php怎么根据值去除数组中的元素
      PHP是一门非常常用的编程语言,用于创建Web应用程序和动态网站。这篇文章将讨论如何在PHP中根据值去除数组中的元素。PHP中的数组是一种非常有用的数据结构,它可以存储多个值并按照索引进行访问。有时候,我们需要根据某些条件去除数组中的元素,...
      99+
      2023-05-14
      php php数组
    • oracle怎么修改表中某一字段的值
      要修改Oracle数据库表中某一字段的值,可以使用UPDATE语句。 语法如下: UPDATE table_name SET col...
      99+
      2023-10-24
      oracle
    • jquery怎么修改cookie中的一个键值对
      在开发网站时,经常需要使用 cookie 来存储用户的数据,JQuery 是其中一个流行的 JavaScript 库,它提供了一些方便的方法来操作 cookie。本文将介绍如何使用 JQuery 修改 cookie 中的一个键值对。下面就让...
      99+
      2023-05-14
    • Java中final的属性值怎么利用反射机制进行修改
      今天就跟大家聊聊有关Java中final的属性值怎么利用反射机制进行修改,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。假设有个类class Person { public fina...
      99+
      2023-05-31
      java fin final
    • java文件合并与修改md5值的问题怎么解决
      今天小编给大家分享一下java文件合并与修改md5值的问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。文本文件合并...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作