【问题标题】:Java HashMap not working [closed]Java HashMap 不工作 [关闭]
【发布时间】:2013-02-06 00:51:04
【问题描述】:

我想我做了所有事情,但 HashMap.get 返回 null。 hashCode 返回相同的整数,equals 返回 true,key 是不可变的,但现在仍然有效。

我错过了什么?

这是我的代码:

public enum MyEnum_1 `AA1, AA2, AA3, AA4`;
public enum MyEnum_2 `BB1, BB2, BB3, BB4`;

public void MyClass()
{
  ...
  final MyEnum_1 enum1;
  final MyEnum_2 enum2;

  public int hashCode()
  {
    return (enum1.ordinal() * 100 + enum2.ordinal());
  }
  public boolean equals(MyClass obj2)
  {
    if (obj2 == null) return false;
    else return (enum1.equals(obj2.getEnum1()) && enum2.equals(obj2.getEnum2()));
  }
...
}
...
Map<MyClass, MyOtherClass> mappp = new HashMap<MyClass, MyOtherClass>(); 
...
mappp.put(obj1, other_obj1);
MyClass obj2 = new MyClass(obj1.getEnum1(), obj1.getEnum2());

System.out.println("hashCode: " + (obj1.hashCode() == obj2.hashCode()));
System.out.println("equals: " + obj1.equals(obj2));
System.out.println("Map Size: " + mappp.size());

MyOtherClass other_objjj = mappp.get(obj2);
System.out.println("other_objjj: " + other_objjj);
...

打印结果如下:

哈希码:真 等于:真 地图大小:1 other_objjj: null

谁能看看我遗漏了什么?

【问题讨论】:

  • 请给我们一个编译的工作示例好吗?
  • @MattBall:看起来 OP 正在为一对枚举的类进行覆盖。实际上,我认为枚举的 equalshashCode 是最终的,所以我不认为你可以覆盖它们。
  • equals() 和 hashCode() 被 MyClass 覆盖。不适用于枚举。枚举只是 MyClass 中的字段。

标签: java hashmap equals hashcode


【解决方案1】:

您还没有覆盖equals(Object) 方法;你equals(MyClass)重载了它。

这样做:

@Override
public final boolean equals(Object obj2)
{
  if (obj2 == this) return true;
  if (!(obj2 instanceof MyClass)) return false;
  MyClass that = (MyClass) obj2;
  return (enum1.equals(that.getEnum1()) && enum2.equals(that.getEnum2()));
}

【讨论】:

  • 埃里克森!乍一看很好的答案。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
相关资源
最近更新 更多