为什么两个 List<Object[]> 在 Java 中不相等?
Why two List<Object[]> not equal in Java?
我有 class 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, p2, p4};
Point[] combinationPoints3 = {p1, p3, p4};
Point[] combinationPoints4 = {p2, p3, p4};
创建 List<Point[]>
:
List<Point[]> expectedResult = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
List<Point[]> expectedResult2 = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
比较 2 List<Point[]>
得到消息 true
:
List<Point[]> expectedResult = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
List<Point[]> expectedResult2 = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
expectedResult.equals(expectedResult2); // TRUE
当我尝试更改订单时:
List<Point[]> expectedResult = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
List<Point[]> expectedResult2 = Arrays.asList(combinationPoints2, combinationPoints1, combinationPoints3, combinationPoints4);
比较时,我得到 false
:
expectedResult.equals(expectedResult2); // FALSE
为什么?
2020 年 8 月 29 日更新
我有 2 List<Point[]>
:
// FIRST
List<Point[]> expectedResult = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, 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 (1.0; 2.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 (1.0; 4.0), Point (5.0; 5.0)]
for(Point[] p1 : actualResult) {
System.out.println(Arrays.toString(p1));
}
// SECOND
[Point (1.0; 1.0), Point (1.0; 2.0), Point (1.0; 4.0)]
[Point (1.0; 1.0), Point (1.0; 2.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 (1.0; 4.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, combinationPoints3, combinationPoints4);
List.equals
方法认为如果两个列表包含相同顺序的“相同”元素,则它们是相等的。这两个列表确实具有相同的元素,但它们的顺序不同。所以equals
方法必须returnfalse
.
还有一个潜在的问题源于数组不根据内容实现 equals 方法:具有相同内容的两个不同数组实例不被 equals 方法视为“相等”。但这在这里并没有发挥作用:无论如何,您所有的数组都有不同的内容。
我有 class 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, p2, p4};
Point[] combinationPoints3 = {p1, p3, p4};
Point[] combinationPoints4 = {p2, p3, p4};
创建 List<Point[]>
:
List<Point[]> expectedResult = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
List<Point[]> expectedResult2 = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
比较 2 List<Point[]>
得到消息 true
:
List<Point[]> expectedResult = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
List<Point[]> expectedResult2 = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
expectedResult.equals(expectedResult2); // TRUE
当我尝试更改订单时:
List<Point[]> expectedResult = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
List<Point[]> expectedResult2 = Arrays.asList(combinationPoints2, combinationPoints1, combinationPoints3, combinationPoints4);
比较时,我得到 false
:
expectedResult.equals(expectedResult2); // FALSE
为什么?
2020 年 8 月 29 日更新
我有 2 List<Point[]>
:
// FIRST
List<Point[]> expectedResult = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, 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 (1.0; 2.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 (1.0; 4.0), Point (5.0; 5.0)]
for(Point[] p1 : actualResult) {
System.out.println(Arrays.toString(p1));
}
// SECOND
[Point (1.0; 1.0), Point (1.0; 2.0), Point (1.0; 4.0)]
[Point (1.0; 1.0), Point (1.0; 2.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 (1.0; 4.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, combinationPoints3, combinationPoints4);
List.equals
方法认为如果两个列表包含相同顺序的“相同”元素,则它们是相等的。这两个列表确实具有相同的元素,但它们的顺序不同。所以equals
方法必须returnfalse
.
还有一个潜在的问题源于数组不根据内容实现 equals 方法:具有相同内容的两个不同数组实例不被 equals 方法视为“相等”。但这在这里并没有发挥作用:无论如何,您所有的数组都有不同的内容。