java中哈希代码的异常行为
我在学习java中的hashCode()时被卡住了。 我编写了一个示例代码PFB片段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
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