Java中HashCode的异常行为

时间:2016-01-24 20:06:52

标签: 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(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()方法架构/平台是否依赖?

2 个答案:

答案 0 :(得分:4)

  

即使在更改密钥hashCode中包含的值相同之后,我也很困惑。它实际上打破了不可改变的关键概念。

不,没关系,没关系。您没有覆盖equalshashCode,因此它没有使用type字段的值作为相等比较的一部分......它只是有效地使用引用标识。 key仍然引用与它相同的对象,因此返回相同的哈希码是完全合理的。影响哈希码或等式的任何内容都没有改变。

如果您希望Shared类型在地图中用作关键字,我建议:

  • 覆盖hashCode()equals(),确保您遵守所有相关合同
  • 防止实例以影响等同的方式发生变异
  • 将其重命名以更清楚地表示它的含义
  

hashCode()方法架构/平台是否依赖?

基本上由实施决定。来自文档:

  

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

Object.hashCode()方法有效总是返回0 ...它只是不太有用。

答案 1 :(得分:1)

如果您未在班级中覆盖hashcode()方法,则可以从Object获取该方法。这意味着在计算哈希码时它不会查看任何类的字段,因此重新设置类型的值什么都不做。

您需要覆盖该方法并计算您班级的所有字段。