我试图实现以下示例来覆盖相等和hashCode方法,如果类具有引用类型成员但没有运气.任何帮助将受到高度赞赏.提前感谢你们..
class Point{
private int x, y;
Point (int x, int y)
{
this.x =x;
this.y = y;
}
}
class Circle
{
int radius;
Point point ;
Circle(int x, int y, int radius)
{
point = new Point (x ,y);
this.radius = radius;
}
@Override
public boolean equals(Object arg) {
if(arg == null) return false;
if(arg == this) return true;
if(arg instanceof Circle)
{
if(this.point ==((Circle) arg).point && this.radius == ((Circle) arg).radius)
{
return true;
}
}
return false;
}
@Override
public int hashCode() {
return point.hashCode() ^ this.radius;
}
}
public class TestClass{
public static void main(String args[])
{
Set<Circle> circle = new HashSet<> ();
circle.add(new Circle(10,20,40));
System.out.println(circle.contains(new Circle(10,20,40))); //
}
}
Run Code Online (Sandbox Code Playgroud)
**************************编辑版,由Alnitak建议*****************
现在我确实得到了预期的结果"true"表示相等,"false"表示不相等的对象.但是当对象值不相等时,不会执行Circle等于方法中的print语句.我不知道我错过了什么,虽然我得到了与非平等对象一样的"假"的相等结果.
class Point{
private int x, y;
Point (int x, int y)
{
this.x =x;
this.y = y;
}
@Override
public boolean equals(Object arg) {
if(arg == null ) return false;
if(arg== this) return true;
if(arg instanceof Point)
{
Point p = (Point) arg;
if(p.x == x && p.y == y )
{
return true;
}
}
return false;
}
@Override
public int hashCode() {
return (this.x*1124739) ^ (this.y*95);
}
}
class Circle
{
int radius;
Point point ;
Circle(int x, int y, int radius)
{
System.out.println("Circle object created x= " + x);
point = new Point (x ,y);
this.radius = radius;
}
@Override
public boolean equals(Object arg) {
if(arg == null) return false;
if(arg == this) return true;
if(arg instanceof Circle)
{
System.out.println("checking circles objects for equality ");
// Doesn't get printed when circle objects values are not equal
Circle c = (Circle) arg;
return (point.equals(c.point) && radius == c.radius);
}
return false;
}
@Override
public int hashCode() {
return point.hashCode() ^ this.radius *37;
}
}
public class TestClass{
public static void main(String args[])
{
Set<Circle> circle = new HashSet<> ();
circle.add(new Circle(10,20,40));
System.out.println(circle.contains(new Circle(11,20,40))); //
}
}
Run Code Online (Sandbox Code Playgroud)
您现有的Circle.equals()方法仅检查引用相等性,而不检查值相等性.它总是会失败,因为每个Circle包含一个新构造的Point对象,该对象对于该实例是唯一的.
您应该创建一个适当的hashCode和equals该方法的Point类.
在Circle类中,您可以使用它Point.equals()来检查保持引用的值相等性,例如:
public boolean equals(Object arg) {
if (arg == null) return false;
if (arg == this) return true;
if (arg instanceof Circle) {
Circle c = (Circle)arg;
return radius == c.radius && point.equals(c.point);
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
对于Circle哈希码,一个简单的选择是xor使用Point的哈希码生成本地哈希码.
| 归档时间: |
|
| 查看次数: |
368 次 |
| 最近记录: |