【问题标题】:Compare same objects in Java [duplicate]比较Java中的相同对象[重复]
【发布时间】:2016-08-15 21:57:43
【问题描述】:

我编写了一个小脚本来获取图像的像素并将其放入 ArrayList 中,然后创建一个包含这些值的类。

这是我的代码的一部分:

int arrC[] = {255, 0, 0};
Color   red = new Color(arrC),
        red2 = new Color(arrC);
if(!red.equals(red2)) System.out.print("It's not the same color !");

还有颜色类:

class Color {

    private int RED;
    private int GREEN;
    private int BLUE;
    private String HEXA;

    public Color(int RGBColors[]) throws ColorException {
        if(RGBColors.length == 3) {
            for(int rgbcolor : RGBColors) {
                HEXA = String.format("#%02x%02x%02x", RGBColors[0], RGBColors[1], RGBColors[2]);
            }
        }else {
            throw new ColorException("Erreur : Number of the value incorrect. 3 excepted not: " + RGBColors.length);
        }
    }

    public Color(int hexacolor) {
        System.out.println(hexacolor);
    }

    /* Getter & Setters */

    public int getRED() {
        return this.RED;
    }

    //...

}

但我不明白为什么变量 red 与变量 red2 不相等,即使它们具有相同的属性。怎么能这样?

【问题讨论】:

  • 因为你没有实现equals,所以它比较引用,不一样。
  • 您需要实现Object.equals 方法(如果您计划使用实例,例如在Maps 内,您应该对hashCode 执行相同的操作),您是否比较了所有属性。跨度>
  • 相关:stackoverflow.com/q/27581/3182664(以及其他数千个问题)
  • 您在构造函数中的哪个位置设置了红色、绿色或蓝色的值?为什么要遍历 RGBColor 数组的 3 个元素,并且在每次迭代时每三个值重新计算并覆盖一些 HEXA 值?是否有充分的理由违反使字段看起来像常量的基本命名准则?请先纠正代码中与实例相等无关的小错误...然后让您的 IDE 生成equalshashCode 以解决您所询问的实际问题。
  • @OlegSklyar 你是对的。我什至不知道我为什么这样做!谢谢。

标签: java object compare equality


【解决方案1】:

java.lang.Object 上默认的 equals() 方法比较内存地址,这意味着所有对象彼此不同(只有两个对同一对象的引用会返回 true)。

所以你需要重写 Color 类的 equals() 和 hashcode() 方法,代码才能正常工作。

【讨论】:

    【解决方案2】:

    您需要在 Color 类中覆盖并实现 equals() 和随后的 hashcode()

    类似:

    @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + BLUE;
            result = prime * result + GREEN;
            result = prime * result + ((HEXA == null) ? 0 : HEXA.hashCode());
            result = prime * result + RED;
            return result;
        }
    
    @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Color other = (Color) obj;
            if (BLUE != other.BLUE)
                return false;
            if (GREEN != other.GREEN)
                return false;
            if (HEXA == null) {
                if (other.HEXA != null)
                    return false;
            } else if (!HEXA.equals(other.HEXA))
                return false;
            if (RED != other.RED)
                return false;
            return true;
        }
    

    【讨论】:

    • 哇,感谢您抽出宝贵时间帮助我。我更好理解!
    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多