热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Java中:如果我将HashMap中的键更改为等于另一个键会发生什么?

如何解决《在Java中:如果我将HashMap中的键更改为等于另一个键会发生什么?》经验,为你挑选了1个好方法。

我知道我不能在HashMap中有两个相等的键(通过equals() - 方法).如果我尝试使用已存在的密钥向HashMap添加键值对,则旧值将被新值替换.

但是如果我将现有密钥更改为等于另一个现有密钥怎么办?

在这种情况下,map.get()方法将如何表现(应用于其中一个相等的键)?

下面非常简单的例子.

public class Person{
  private int age;
  private String name;

  public Person(int a, String n){
    age = a;
    name = n;
  }

  public void setAge(int a){ age = a; }
  public int getAge(){return age; }
  public String getName() {return name; }

  @Override
  public boolean equals(Object o){
     if(!(o instanceof Person)){return false;}
     Person p = (Person) o;
     return ((p.getName().equals(this.getName())) && (p.getAge() == this.getAge()));
  }

  @Override
  public int hashCode(){return age;}
}

public class MainClass{
 public static void main(String[]args){
   Person p1 = new Person("Bill", 20);
   Person p2 = new Person("Bill", 21); 
   HashMap map = new HashMap<>();
   map.put(p1, "some value");
   map.put(p2, "another value");
   p1.setAge(21);
   String x = map.get(p1); // <-- What will this be??
   System.out.println(x);  
 }

}

Eran.. 6

当你改变你已经存在的一个键时,HashMap你就会破坏HashMap.你不应该改变现有的密钥HashMap.如果你必须改变这些键,你应该从HashMap更改之前删除它们,并在更改之后put再次删除它们HashMap.

map.get(p1)p1根据其新的搜索密钥,该密钥hashCode等于哈希码p2.因此,它将在包含的存储桶中进行搜索p2,并返回相应的值 - "another value"(除非两个键恰好映射到同一个存储桶,在这种情况下,可以返回任一值,具体取决于首先测试哪个键是否相等).



1> Eran..:

当你改变你已经存在的一个键时,HashMap你就会破坏HashMap.你不应该改变现有的密钥HashMap.如果你必须改变这些键,你应该从HashMap更改之前删除它们,并在更改之后put再次删除它们HashMap.

map.get(p1)p1根据其新的搜索密钥,该密钥hashCode等于哈希码p2.因此,它将在包含的存储桶中进行搜索p2,并返回相应的值 - "another value"(除非两个键恰好映射到同一个存储桶,在这种情况下,可以返回任一值,具体取决于首先测试哪个键是否相等).


推荐阅读
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了Java中Currency类的getInstance()方法,该方法用于检索给定货币代码的该货币的实例。文章详细解释了方法的语法、参数、返回值和异常,并提供了一个示例程序来说明该方法的工作原理。 ... [详细]
  • HashMap:键值对(key-value):通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.默认是1:1关系:存在则覆盖,当key已经存在,则利用新的va ... [详细]
  • 我有3个来自RESEARCHS的映射值,指定要使用参考数据集填充的行中的范围。该研究 ... [详细]
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • 类Hashtable<K,V>所有已实现的接口:Serializable,Cloneable,Map<K,V>此类实现一个哈希表,该哈希表将键映 ... [详细]
author-avatar
Not-Only-For曾广超
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有