java中哈希代码的异常行为

java中哈希代码的异常行为,java,hashmap,Java,Hashmap,我在学习java中的hashCode()时被卡住了。 我编写了一个示例代码PFB片段 public class Shared { String type; Date date; public Shared(String type) { this.type = type; } public void setType(String type) { this.type = type; this.date = new Date(19894894823948

我在学习java中的hashCode()时被卡住了。 我编写了一个示例代码PFB片段

public class Shared {
    String type;
    Date date;
 public Shared(String type) {
    this.type = type;

 }

public void setType(String type) {
    this.type = type;
    this.date = new Date(19894894823948L);
}

public static void main(String arg[]) {
    HashMap<Shared, String> hm = new HashMap<Shared, String>();
    Shared key = new Shared("me");
    Shared key1 = new Shared("me1");
    hm.put(key1, "value1");
    hm.put(key, "value");

    System.out.println(key.hashCode());//returning hashcode suppose X
    key.type=null;
    key.setType("type");
    System.out.println(key.hashCode());// it's even returning X again
    key.type="null";
    System.out.println(key.hashCode());// it's even returning X again.
公共类共享{
字符串类型;
日期;
公共共享(字符串类型){
this.type=type;
}
公共void集合类型(字符串类型){
this.type=type;
this.date=新日期(19894894823948L);
}
公共静态void main(字符串arg[]){
HashMap hm=新的HashMap();
共享密钥=新共享(“me”);
共享密钥1=新共享(“me1”);
hm.put(键1,“值1”);
hm.put(键,“值”);
System.out.println(key.hashCode());//假设X返回hashCode
key.type=null;
key.setType(“type”);
System.out.println(key.hashCode());//它甚至再次返回X
key.type=“null”;
System.out.println(key.hashCode());//它甚至再次返回X。
}

我真的很困惑,即使更改了密钥hashCode中包含的值,这怎么可能是相同的。这实际上打破了不可变密钥的概念


hashCode()方法是否依赖于体系结构/平台?

如果不重写类中的
hashCode()
方法,则将从
对象中获取它。这意味着在计算hashCode时,它不会查看类的任何字段,因此重新设置type的值不会产生任何效果


您需要重写该方法并计算类的所有字段。

如果不重写类中的
hashcode()
方法,您将从
对象获得它。这意味着在计算hashcode时,它不会查看类的任何字段,因此重新设置type的值不会产生任何效果

您需要重写该方法并计算类的所有字段

我真的很困惑,即使更改了密钥hashCode中包含的值,这怎么可能是相同的。这实际上打破了不可变密钥的概念

不,这很好。您没有重写
equals
hashCode
,因此它没有使用
type
字段的值作为相等比较的一部分……它只是有效地使用引用标识。
键仍然引用它所引用的相同对象,因此返回相同的has是完全合理的h代码。未更改任何影响哈希代码或相等的内容

如果您希望您的
共享
类型在地图中用作键,我建议:

  • 覆盖
    hashCode()
    equals()
    ,确保您遵守所有相关合同
  • 防止实例以影响平等的方式发生变异
  • 重新命名它,以便更清楚地了解它的含义
hashCode()方法是否依赖于体系结构/平台

基本上,这取决于实施。从文档中可以看出:

只要合理可行,类
Object
定义的
hashCode
方法会为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但Java不需要这种实现技术。)™ 编程语言。)

如果
Object.hashCode()
方法总是返回0,这将是有效的……这将不是很有用

我真的很困惑,即使更改了密钥hashCode中包含的值,这怎么可能是相同的。这实际上打破了不可变密钥的概念

不,这很好。您没有重写
equals
hashCode
,因此它没有使用
type
字段的值作为相等比较的一部分……它只是有效地使用引用标识。
键仍然引用它所引用的相同对象,因此返回相同的has是完全合理的h代码。未更改任何影响哈希代码或相等的内容

如果您希望您的
共享
类型在地图中用作键,我建议:

  • 覆盖
    hashCode()
    equals()
    ,确保您遵守所有相关合同
  • 防止实例以影响平等的方式发生变异
  • 重新命名它,以便更清楚地了解它的含义
hashCode()方法是否依赖于体系结构/平台

基本上,这取决于实施。从文档中可以看出:

只要合理可行,类
Object
定义的
hashCode
方法会为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但Java不需要这种实现技术。)™ 编程语言。)


Object.hashCode()
方法始终返回0是有效的……它不会很有用。

您是否创建了
Shared
类?是否重写了
hashCode()
equals()
?HashMap
如何影响
hashCode())
生成
共享的
类?我想,如果不将
key1
key
放入HashMap中,您会得到相同的结果……看起来很可能您要么覆盖了
hashCode
而不使用
类型
,要么根本没有覆盖它……但我们无法判断什么时候可以覆盖它没有看到
Shared.hashCode
的代码。请发布一个。好吧,我们开始吧。它的行为完全符合我的预期。您是否创建了
Shared
类的可能副本?您是否覆盖了
hashCode()
equals()
?HashMap
hashCode()有何影响
生成
共享的
类?我想,如果不将
key1
key
放入HashMap中,您会得到相同的结果……似乎很可能是覆盖了
hashCode
而不使用
t