java - 获取 hashmap 中的等价元素

标签 java hashmap equals

应用程序会提示用户是否猜出了他引入的两种颜色组合。

我正在使用 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 也有 HashCodeBuilderEqualsBuilder

关于java - 获取 hashmap 中的等价元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10308667/

相关文章:

r - 表中的重复行与值具有列参数的次数相同(在 R 或 Excel 中)

c# - java相当于.net FileStream

java - 严重: Allocate exception for servlet myServletName

Java 项目 : Make HashMap (including Load-Store) Performance Better

java - 通过名称和 JTextComponent 获取组件

javascript - 如何在javascript中将值存储在hashmap中

if-statement - 检查空格键是否相等?

java - Map键比较中使用的equals方法

java - 如何将以下 json 字符串转换为 java 对象?

java - 帮助开关盒