我在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.
}
即使在更改密钥hashCode中包含的值相同之后,我也很困惑。它实际上打破了不可改变的关键概念。
hashCode()方法架构/平台是否依赖?
答案 0 :(得分:4)
不,没关系,没关系。您没有覆盖即使在更改密钥hashCode中包含的值相同之后,我也很困惑。它实际上打破了不可改变的关键概念。
equals
或hashCode
,因此它没有使用type
字段的值作为相等比较的一部分......它只是有效地使用引用标识。 key
仍然引用与它相同的对象,因此返回相同的哈希码是完全合理的。影响哈希码或等式的任何内容都没有改变。
如果您希望Shared
类型在地图中用作关键字,我建议:
hashCode()
和equals()
,确保您遵守所有相关合同hashCode()方法架构/平台是否依赖?
基本上由实施决定。来自文档:
尽可能合理,类
hashCode
定义的Object
方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但Java™编程语言不需要此实现技术。)
Object.hashCode()
方法有效总是返回0 ...它只是不太有用。
答案 1 :(得分:1)
如果您未在班级中覆盖hashcode()
方法,则可以从Object
获取该方法。这意味着在计算哈希码时它不会查看任何类的字段,因此重新设置类型的值什么都不做。
您需要覆盖该方法并计算您班级的所有字段。