当前位置: 首页 > 面试题库 >

更改用作Map键的对象

陈宏胜
2023-03-14
问题内容

令V为一个具有单个属性的类,该属性名为K以及其getter和setters。

如果执行该怎么办:

V v = new V();
v.setK("a");
HashMap<K,V> map = new HashMap<K,V>();
map.put(v.getk(),v);
v.setK("b");

据我所知,这应该会引起某种问题,因为映射键应该是不变的。这里会发生什么?

编辑:认为该键不是字符串,而是如下文所述的可变对象。


问题答案:

这个问题的标题具有误导性-您没有更改map键,就像在更改 用作map key的对象时一样 。当您说时map.put(x, y),您将创建一个聚合两个独立值的 映射条目keyvalue
。地图看不到键的来源,它只是两个对象。因此,您创建了一个地图项("a", v),然后更改了v的状态-这不可能影响地图项的键“
a”。另一方面,如果您有自己制作的对象K,例如

public class K { 
  private String s;
  public K(String s) { this.s = s; }
  public void setS(String s) { this.s = s; }
  public boolean equals(Object o) { return ((K)o).s.equals(this.s); }
  public int hashCode() { return s.hashCode(); }

}

现在你做

final K k = new K("a");
map.put(k, v);
k.setS("b");
map.get(k);

那么您将面临问题-您 将用作映射键的对象进行了变异



 类似资料:
  • 问题内容: 输出为: 这种“获取”方法的行为如何?由于m1和M2都具有相同的值,并且我没有重写hashcode(),因此将调用对象类的equals()方法吗? 这样对吗 ? 没有哈希码方法,因此JVM无法查看对象m1和m2是否包含不同的值 没有覆盖equals的方法,因此调用了Object类的equals(),并且由于两个对象都不相同,因此上面的代码可以很好地工作,而无需m2替换m1的值。 问题答

  • 问题内容: 我正在尝试更改持久对象的ID。我在Hibernate和MySQL中使用JPA。我执行代码时遇到的错误是:org.hibernate.HibernateException:com.tutorial.jpa.certification.listing5_18.AA实例的标识符从2更改为99 我找不到此问题的答案,因此在此感谢您的帮助。代码为: 问题答案: 您永远不要修改实体的主键 -这定义

  • 问题内容: 我有一个可编辑单元格。当我单击一个单元格时,它将进入编辑模式;当我使用方向箭头在单元格中移动时,也会发生同样的情况。现在,我想选择单元格而不是开始编辑,并且仅在按下键时才编辑单元格。 如果需要任何其他信息,请索取。 编辑:键的动作 现在这是用于左箭头动作,不难从这一个推论出其余三个: 这是您绑定此操作的方式: 哦,我差点忘了,要选择单元格而不是在“鼠标单击”上进行编辑: 将必须添加到表

  • 这里对调是指调换 key 和 value。如果 map 的值类型可以作为 key 且所有的 value 是唯一的,那么通过下面的方法可以简单的做到键值对调。 示例 8.7 invert_map.go: package main import ( "fmt" ) var ( barVal = map[string]int{"alpha": 34, "bravo": 56, "cha

  • 问题内容: 我已经建立了一个表,该表包含带有外键的列,并将其设置为(删除父级时删除子级) SQL命令将其更改为什么?(如果有孩子,则不能删除其父母) 问题答案: 旧问题,但添加了答案,以便获得帮助 它分为两个步骤: 假设,a 具有 列名称为, 约束条件 名称为的 外键 ,并通过键被引用到表中( 如下图所示 )。 第一步 ,删除旧的约束:(参考) 通知约束已删除,列未删除 第二步 ,添加新约束: 添

  • 这就是我生成dutylist的方法。 这将更改对的第二个值 但是它会更改pos中的其他值,也就是说,如果我更改了StaffListUpdated[0].third[0]=pair,它也会更改StaffListUpdated[1].third[0]=pair。我试过很多种方法,但都无济于事。