gpt4 book ai didi

java - 什么不可变对象(immutable对象)可以与 List.contains 一起使用?

转载 作者:行者123 更新时间:2023-12-02 00:59:29 25 4
gpt4 key购买 nike

我想创建一个坐标列表,并能够检查该列表是否包含新坐标。

我尝试实现 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com