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

标签 java list immutability contains

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

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

相关文章:

java - 设置 jax-ws 客户端超时

python - 使用python函数比较列表中的行和列

c# - IEquatable<T>、IComparable<T> 是否应该在非密封类上实现?

java - 在不转换为列表的情况下在 MongoDB 中存储 float 数组

javascript - AppleScript:在 javascript 中循环

JavaScript 安全 : force deletion of sensitive data

javascript - 覆盖返回的对象引用

java - 三元运算符给出 "Not a statement"错误

java - 错误 ORA-01000 : maximum open cursors exceeded

java - java中memcached中设置操作的IOException