检查列表是否包含对象-java

检查列表是否包含对象-java,java,Java,我正在编写图像处理程序,但列表有问题 我有一份分数表 class Point1{ private int x; private int y; Point1(int x,int y) { this.x = x; this.y = y; } int getX(){ return this.x; } int getY() {retur

我正在编写图像处理程序,但列表有问题

我有一份分数表

     class Point1{
        private int x;
        private int y;

        Point1(int x,int y)
        {
            this.x = x;
            this.y = y;
        }

       int getX(){ return this.x; }
       int getY() {return this.y; }
    }

    ArrayList<Point1> list = new ArrayList();
正在检查我的列表中是否有特定对象。如果我把它放在

    Point1 first = new Point(1,1);  
    list.add(first);
    list.contains(first) // and this is true
但是:

第二点=新点(2,2);
列表。添加(第二);

包含(新的点(2,2)) 您需要在
类上覆盖
等于
。您的
类必须负责确定另一个
对象是否与当前对象“相等”。
ArrayList
将调用
equals
,以确定传入
的对象是否包含与列表中的任何项“相等”

如果不重写
equals
,则
将继承,只需查看它是否是同一个精确对象。这就是为什么您的第一个代码“有效”,因为您正在使用
first
。它还解释了为什么您的第二个代码不能“工作”,因为您使用了不同的对象


另外,如果您重写
equals
,最好也重写
hashCode
(反之亦然)。

您需要在
点上重写
equals
。您的
类必须负责确定另一个
对象是否与当前对象“相等”。
ArrayList
将调用
equals
,以确定传入
的对象是否包含与列表中的任何项“相等”

如果不重写
equals
,则
将继承,只需查看它是否是同一个精确对象。这就是为什么您的第一个代码“有效”,因为您正在使用
first
。它还解释了为什么您的第二个代码不能“工作”,因为您使用了不同的对象


另外,如果您重写
equals
,最好也重写
hashCode
(反之亦然)。

列表使用
equals
方法确定两个对象是否相等

如果您的类不重写
公共布尔等于(对象o){..}
方法,它将从提供该实现的最近超类型继承它

如果您的类不扩展任何其他类,则表示它隐式扩展了
对象
类。因此,它将继承它的
equals
实现。问题是此实现看起来像:

public boolean equals(Object obj) {
    return (this == obj);
}
因此,它使用引用相等运算符
==
。这意味着
equals
只有在对象与自身进行比较时才会返回true(对其他对象的引用总是不同于对
对象的引用)

在您的情况下,如果
Point1
的其他实例的状态(值
x
y
)相等,您的equals方法也将返回
true

@Override
public boolean equals(Object other) {
    if(this == other)
        return true;
    if(!other instanceof Point1)
        return false;
    Point1 otherPoint= (Point1)other;
    if(this.x == otherPoint.getX() && this.y == otherPoint.getY())
        return true;
    return false;
}
你可以得到你想要的结果:


顺便说一句,在重写
equals
方法时,我们还应该重写
hashcode
方法。请参阅

列表使用
equals
方法确定两个对象是否相等

如果您的类不重写
公共布尔等于(对象o){..}
方法,它将从提供该实现的最近超类型继承它

如果您的类不扩展任何其他类,则表示它隐式扩展了
对象
类。因此,它将继承它的
equals
实现。问题是此实现看起来像:

public boolean equals(Object obj) {
    return (this == obj);
}
因此,它使用引用相等运算符
==
。这意味着
equals
只有在对象与自身进行比较时才会返回true(对其他对象的引用总是不同于对
对象的引用)

在您的情况下,如果
Point1
的其他实例的状态(值
x
y
)相等,您的equals方法也将返回
true

@Override
public boolean equals(Object other) {
    if(this == other)
        return true;
    if(!other instanceof Point1)
        return false;
    Point1 otherPoint= (Point1)other;
    if(this.x == otherPoint.getX() && this.y == otherPoint.getY())
        return true;
    return false;
}
你可以得到你想要的结果:


顺便说一句,在重写
equals
方法时,我们还应该重写
hashcode
方法。请参见

是否覆盖了类的
hashCode
equals
方法?是的。是的,你应该。这里有一个很好的参考:它是
contains
用来查看它是否包含在列表中的,所以是的,您应该这样做。您是否覆盖了类的
hashCode
equals
方法?是的。是的,你应该。这里有一个很好的参考:它是
contains
用来查看它是否包含在列表中的内容,因此是的,您应该“最好重写”-更提前地说,两个相等的对象必须返回相同的哈希代码。因此,通常在重写
equals
时,必须重写
hashCode
。如果这不是一个选项,ApacheCommonsLang(3.x)有用于构建哈希代码和equals方法的实用程序。“最好重写”-更为早熟的是,两个相等的对象必须返回相同的哈希代码。因此,通常在重写
equals
时,必须重写
hashCode
。如果这不是一个选项,ApacheCommonsLang(3.x)具有用于构建哈希代码和equals方法的实用程序。