检查列表是否包含对象-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方法的实用程序。