为什么两个List <Object []>在Java中不相等?

问题描述

我的类Point具有重写的方法equals()hashCode()

public class Point {
    private double x;
    private double y;

    public Point() {
    }

    public Point(double x,double y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Point point = (Point) obj;
        if (this.x != point.getX()) {
            return false;
        }
        if (this.y != point.getY()) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        return (int) (31 * x + y);
    }
}

我创建了points

        p1 = new Point(1.0,1.0);
        p2 = new Point(1.0,2.0);
        p3 = new Point(1.0,4.0);
        p4 = new Point(5.0,5.0);

这是点数组-组合:

        Point[] combinationPoints1 = {p1,p2,p3};
        Point[] combinationPoints2 = {p1,p4};
        Point[] combinationPoints3 = {p1,p3,p4};
        Point[] combinationPoints4 = {p2,p4};

创建List<Point[]>

List<Point[]> expectedResult = Arrays.asList(combinationPoints1,combinationPoints2,combinationPoints3,combinationPoints4);

List<Point[]> expectedResult2 = Arrays.asList(combinationPoints1,combinationPoints4);

比较2 List<Point[]>并收到消息true

List<Point[]> expectedResult = Arrays.asList(combinationPoints1,combinationPoints4);

expectedResult.equals(expectedResult2);    // TRUE

当我尝试更改订单时:

List<Point[]> expectedResult = Arrays.asList(combinationPoints1,combinationPoints4);

List<Point[]> expectedResult2 = Arrays.asList(combinationPoints2,combinationPoints1,combinationPoints4);

比较时,我得到false

expectedResult.equals(expectedResult2);    // FALSE

为什么?

更新2020年8月29日
我有2个List<Point[]>

// FirsT
List<Point[]> expectedResult = Arrays.asList(combinationPoints1,combinationPoints4);

List<Point[]> actualResult = calculatePoint.getCombinationsElementsOver(startingPoints,pointsOnLine);

包含内容

for(Point[] p1 : expectedResult) {
            System.out.println(Arrays.toString(p1));
        }
// FirsT

[Point (1.0; 1.0),Point (1.0; 2.0),Point (1.0; 4.0)]
[Point (1.0; 1.0),Point (5.0; 5.0)]
[Point (1.0; 1.0),Point (1.0; 4.0),Point (5.0; 5.0)]
[Point (1.0; 2.0),Point (5.0; 5.0)]
for(Point[] p1 : actualResult) {
            System.out.println(Arrays.toString(p1));
        }

// SECOND
[Point (1.0; 1.0),Point (5.0; 5.0)]

我通过方法检查身份列表:

private <T> boolean listEqualsIgnoreOrder(List<T> list1,List<T> list2) {
        return new HashSet<>(list1).equals(new HashSet<>(list2));
    }

为什么在以下情况下得到false

boolean result = listEqualsIgnoreOrder(expectedResult,actualResult);

解决方法

这两个列表具有相同的元素,但顺序不同:

List<Point[]> expectedResult = Arrays.asList(combinationPoints1,combinationPoints2,combinationPoints3,combinationPoints4);

List<Point[]> expectedResult2 = Arrays.asList(combinationPoints2,combinationPoints1,combinationPoints4);

List.equals方法认为两个列表包含相同顺序的“相同”元素时,它们是相等的。这两个列表确实具有相同的元素,但是它们的顺序不同。因此,equals方法必须返回false

还有一个潜在的问题,是由于数组没有基于内容实现equals方法的事实:equals方法不会将两个具有相同内容的不同数组实例视为“ equal”。不过,这并没有发挥作用:无论如何,您所有的数组都有不同的内容。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...