等于方法覆盖问题

时间:2013-11-25 07:31:01

标签: java

我是java的新学习者。我为我的Animal类重写了equalshashcode。我希望,使用HashSet<Animal>,如下所示,Animal中只会插入一个HashSet。但是,尽管具有相同的属性,第二个Animal对象仍会添加到集合中。任何人都可以看一下吗?

import java.util.*;

class SetTest
{    
    public static void main(String [] args)
    {
      Set<Animal>s=new HashSet<Animal>();
      Animal a=new Animal(2);
      boolean b1=s.add(a);
      System.out.println("hi "+b1);

      Animal b=new Animal(2);
      boolean b2=s.add(b);
      System.out.println("hi "+b2);    
    }
}


class Animal
{
    int t;
    Animal(int a)
    {
        t=a;       
    }

    public boolean equals(Object O)
    {
        if(O instanceof Animal && ((Animal)O).t==t)
            return true;

        return false;
    }

    public int hashcode()
    {   
        return t; 
    }
}

输出: 嗨,真的 嗨,真的

非常感谢。

4 个答案:

答案 0 :(得分:7)

您没有覆盖hashCode()。您介绍了另一种名为hashcode()的方法。案件很重要。

如果您想要覆盖方法,请始终使用@Override注释:

@Override
public int hashcode()

如果你这样做了,编译器就会注意到这个错字并拒绝编译该类。

答案 1 :(得分:1)

您的代码有一个错误的哈希码:写hashCode而不是哈希码。

import java.util.*;
class SetTest { 
  public static void main(String [] args) { 
    Set<Animal>s=new HashSet<Animal>();
   Animal a=new Animal(2);
    boolean b1=s.add(a);
    System.out.println("hi "+b1);
     Animal b=new Animal(2);
    boolean b2=s.add(b);
     System.out.println("hi "+b2); 
  } 
}

class Animal { 
  int t;

  public Animal(int a) {
      t=a;
  }

  @Override
  public boolean equals(Object O) {
    return O instanceof Animal 
            && ((Animal)O).t==t;
  }

   @Override
   public int hashCode() { 
     return t;
  }
}

答案 2 :(得分:0)

如果您正在使用eclipse,您可以使用源代码生成器,避免常见的人为错误(就像您在此处所做的那样。右键单击类 - &gt; source - &gt;生成哈希码和等于方法。它会弹出窗口。在那里你可以选择你需要考虑的等于(对象相等)和哈希码生成的字段。

答案 3 :(得分:0)

Java使用hashCode和equals方法来检查两个对象是否相等。 HashSet在内部使用HashMap。您可以参考HashMap.put(K键,V值)方法获取更多详细信息。