我想在我的Point类中覆盖equals和hashCode方法。我想在列表中使用Point1类对象,我想检查列表中是否有一个具有相同坐标的点,并且它不需要是同一个对象。只在字段中具有相同的值。
这是我的代码,我不知道为什么它不起作用
package prac1;
import java.util.ArrayList;
import java.util.List;
class Point{
private Integer x;
private Integer y;
Point(int x,int y)
{
this.x = x;
this.y = y;
}
@Override
public int hashCode() {
int hash = 5;
hash = hash +(this.x != null ? this.x.hashCode() : 0);
hash = hash/12 + (this.y != null ? this.y.hashCode() : 0); //to have unique hashCode for different objects
return hash;
}
@Override
public boolean equals(Object other)
{
if(this == other) return true;
if(other == null) return false;
if(getClass() != other.getClass()) return false;
Point1 test = (Point1)other;
if(this.x == test.getX() && this.y == test.getY())
return true;
return false;
}
int getX(){ return this.x; }
int getY() {return this.y; }
}
public class NewClass{
public static void main(String args[])
{
List<Point1> lista = new ArrayList<Point1>();
Point1 t = new Point1(1,1);
lista.add(t);
System.out.println(lista.contains(t)); // true
System.out.println(lista.contains(new Point1(1,1))); // false ?
}
}
它返回:
true
false
谁能告诉我我做错了什么?
答案 0 :(得分:3)
如果我将您的Point
课程重命名为Point1
,那么它会在我的计算机上生成true
true
,因此您的代码可以正常运作。
但是您的代码中存在错误。您在==
个对象上使用Integer
。这仅适用于-128
和127
(reference)之间的整数值,因为这些值由JVM缓存。但它不会为更大/更小的价值而努力。而是使用.equals
Point1 test = (Point1)other;
if(this.x.equals(test.getX()) && this.y.equals(test.getY()))
return true;
return false;
我在if
或this.x == null
时遗漏了this.y == null
,因为构造函数只接受基元,因此目前代码中不可能这样做。