[英]Is Java hashCode() method a reliable measure of object equality?
[英]how do you implement the equality and hashCode method if the class has reference type members java?
我正在嘗試實現以下示例,以在類具有引用類型成員但沒有運氣的情況下覆蓋均等和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))); //
}
}
**************************編輯版本,由Alnitak建議*****************
現在,對於相等的對象,我確實獲得了預期的結果“ true”,對於非相等的對象則獲得了“ false”。 但是,當對象值不相等時,不會執行Circle的equal方法中的print語句。 我不知道我缺少什么,盡管我得到了對非相等對象所期望的相等結果“ false”。
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))); //
}
}
您現有的Circle.equals()
方法僅檢查引用相等,而不檢查值相等。 它將始終失敗,因為每個Circle
包含一個新構造的Point
對象,該對象對該實例是唯一的。
您應該為Point
類創建一個正確的hashCode
和equals
方法。
然后,您可以在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;
}
對於Circle
哈希碼,一個簡單的選項是生成本地哈希碼,並將其與Point的哈希碼進行xor
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.