我想创建一个坐标列表,并能够检查该列表是否包含新坐标。
我尝试实现 Pair
,但是将 List.contains()
与 Pair
一起使用不起作用,总是返回 false。
我还可以使用哪些其他对象来检查 List.contains()
?
最佳答案
这可能是因为您的 Pair
实现没有提供重写的 equals
方法。我能够使用以下代码重现您的问题:
//a plain POJO, in Pair.java
public class Pair<A, B> {
private A a;
private B b;
public Pair(A a, B b) {
this.a = a;
this.b = b;
}
public A getA() {
return a;
}
public B getB() {
return b;
}
}
//... Main.java
public class Main {
public static void main(String[] args) {
List<Pair<Integer, String>> list = new ArrayList<>();
Pair<Integer, String> one = new Pair<>(1, "hello");
Pair<Integer, String> two = new Pair<>(1, "hello");
list.add(one);
System.out.println(list.contains(two));
}
}
这会打印出 false
,因为 List.contains
使用对象相等性作为测试(Object 类中的默认
)。例如,对于上述代码,equals
方法) one.equals(two)
的计算结果为 false
,因为它们不是同一个对象。要解决此问题,您必须提供一个 equals
方法来查看每个字段并单独比较它们:
//in class Pair
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Pair<?, ?> pair = (Pair<?, ?>) o;
return Objects.equals(a, pair.a) &&
Objects.equals(b, pair.b);
}
您可以将编写此代码这一有些乏味且容易出错的任务委托(delegate)给您的 IDE。我使用的是 Intellij,只需单击 Code/Generate/equals() 和 hashcode() 即可。对于这种特殊情况,您不需要 hashcode()
,但将 equals()
和 hashcode()
放在一起总是一个好主意。现在,当 List.contains
尝试查找与您提供的元素相同的元素时,它将使用这一新的且更合适的方法。如果您再次运行 main
方法,您将看到它的计算结果为 true
。
关于java - 什么不可变对象(immutable对象)可以与 List.contains 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60890211/