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