在java中重写hashcode和equals

在java中重写hashcode和equals,java,Java,我不清楚hashcode和equals方法在java中的用法 首先 若我重写了only equals方法,所有值为Fred的对象都会通过HashSet实现set接口进行添加,而set接口不能接受重复的值 秒 如果我重写equals和hashcode,只有一个对象被添加到HashSet。为什么 第三 如果我在这种情况下只实现equals,那么删除一个Fred对象会删除所有对象吗 class Person { String name; Person(String name) {

我不清楚hashcode和equals方法在java中的用法

首先

若我重写了only equals方法,所有值为Fred的对象都会通过HashSet实现set接口进行添加,而set接口不能接受重复的值

如果我重写equals和hashcode,只有一个对象被添加到HashSet。为什么

第三 如果我在这种情况下只实现equals,那么删除一个Fred对象会删除所有对象吗

class Person
{
    String name;
    Person(String name) {
        this.name=name;
    }

    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof Person))
        {
       return false;
         }
    Person p = (Person)obj;
    return p.name.equals(this.name);
       }


    /*@Override
    public int hashCode() {
        return name.hashCode();
    }*/
}

public class HashSetDemo {

    /*
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashSet<Person> s= new HashSet<Person>();
        s.add(new Person("Fred"));
        s.add(new Person("Fred"));
        s.add(new Person("Fred"));
        s.add(new Person("Fred1"));
        for(Person a:s) {
            System.out.println(a.name);
        }

        s.remove(new Person("Fred"));
        System.out.println(s);
    }
}
班级人员
{
字符串名;
Person(字符串名称){
this.name=name;
}
@凌驾
公共布尔等于(对象obj){
如果(!(人的obj实例))
{
返回false;
}
人员p=(人员)obj;
返回p.name.equals(this.name);
}
/*@凌驾
公共int hashCode(){
返回name.hashCode();
}*/
}
公共类HashSetDemo{
/*
*@param args
*/
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
HashSet s=新的HashSet();
s、 添加(新人员(“Fred”);
s、 添加(新人员(“Fred”);
s、 添加(新人员(“Fred”);
s、 添加(新人员(“Fred1”);
(个人a:s){
System.out.println(a.name);
}
s、 免职(新员工(“Fred”);
系统输出打印项次;
}
}

equals方法的问题是
this.name==emp.name
这检查两个字符串是否指向您应该使用的相同内存
equals
而不是
this.name.equals(emp.name)
。这将解决你的第一个问题

hashCode
方法告诉您如何转换为
hashCode
。由于您使
hashCode
等于名称的
hashCode
所有
fred
都具有相同的
hashCode
,因此它们在
HashSet
中都会相互覆盖。这回答了你的第二个问题

我不知道HashSet的具体实现,但解决了第一个问题后,这就不是问题了。

摘自Joshua Bloch的《有效Java》,第9项:

您必须在每个重写
等于的类中重写
hashCode
否则将违反
对象的一般约定。hashCode
,这将阻止您的类与所有基于哈希的集合(包括
HashMap
)一起正常运行,
HashSet
Hashtable

Eclipse IDE将为您生成一个
hashCode
equals
方法

大多数
hashCode
方法如下所示:

public int hashCode() {
    int result = 17;
    result = 31 * result + field1;   (int)
    result = 31 * result + field2.hashCode();   (Object)
    ... for the rest of the fields.
    return result;
}

这看起来很像家庭作业。如果是,请将其标记为这样。@prerna如需详细解释,请检查此项。我已使用equals更改了代码。它仍会打印Fred三次。您没有取消注释
HashCode
HashCode
方法确定
HashSet
是否正常工作。看看吉尔伯特·勒布兰科的回答。同样,如果你做了
Person p=新人(“Fred”);人员p1=新人员(“Fred”);系统输出println(p等于(p1))
您将得到
true
打印。