应用程序会提示用户是否猜出了他引入的两种颜色组合。
我正在使用 HashMap 来保存“TwoColors”对象和 boolean 值。 TwoColors 类是下一个:
public class TwoColors{
public MyColor color1;
public MyColor color2;
public TwoColors(MyColor color1, MyColor color2){
this.color1 = color1;
this.color2 = color2;
}
@Override
public boolean equals(Object obj) {
TwoColors o = (TwoColors) obj;
return color1 == o.color1 && color2 == o.color2;
}
}
MyColor 是一个枚举
public enum MyColor{
RED,BLUE,YELLOW,BROWN;
}
我测试放置一个 TwoColor 对象键并打印其值
public static void main(String[] args){
HashMap<TwoColors, Boolean> hash = new HashMap<TwoColors, Boolean>();
hash.put(new TwoColors(MyColor.RED,MyColor.BLUE),new Boolean(true));
System.out.println(hash.get(new TwoColors(MyColor.RED,MyColor.BLUE)));
}
尽管我已经重写了 TwoColors 的 equals 方法,但上面的代码输出 null
。知道我在这里缺少什么吗?
最佳答案
当您覆盖 equals 时,您应该始终覆盖 hashcode,如果您在尝试通过调用 get 查找值时不这样做,您的 hashmap 将无法找到它。
阅读this发布以供理解。
可以使用 Eclipse 获取的默认哈希码:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((color1 == null) ? 0 : color1.hashCode());
result = prime * result + ((color2 == null) ? 0 : color2.hashCode());
return result;
}
此外,您的 equals 实现不是生产代码,这意味着它没有正确实现。您的实现开放给 ClassCastException
由于您盲目地将其转换为 MyColor
,因此您的实现是否容易出现 NullPointerException
.
它应该类似于这样:
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
TwoColors other = (TwoColors) obj;
if (color1 != other.color1)
return false;
if (color2 != other.color2)
return false;
return true;
}
在检查字段值之前,检查两个引用是否相同,检查是否为 null,检查类是否相等,最后检查字段值。
虽然 Apache 也有 HashCodeBuilder
和 EqualsBuilder
关于java - 获取 hashmap 中的等价元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10308667/