关于hashcode()和equals()

时间:2012-04-15 18:33:10

标签: java hashcode

我有一个POJO,其中包含我已覆盖的hashcode()equals()方法,但我的问题是,如果我将hashcode()方法注释然后收集,那么请在hashmap当我存储用户定义的对象然后它会产生什么影响...另一件事是如果我将equals方法作为注释,那么它将具有什么影响如果我尝试输入重复记录将存储重复记录两次!

public class Employee {

 String name,job;
 int salary;

 public Employee(String n , String j, int t )
 {
     this.name= n;
     this.job=j;
     this.salary= t;         
 }

/* @Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((job == null) ? 0 : job.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    result = prime * result + salary;
    return result;
}*/

 /*@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Employee other = (Employee) obj;
    if (job == null) {
        if (other.job != null)
            return false;
    } else if (!job.equals(other.job))
        return false;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))
        return false;
    if (salary != other.salary)
        return false;
    return true;
}
 */

 @Override
 public int hashCode()
     {       
     return name.hashCode()+job.hashCode()+salary;       

 }

 @Override
    public boolean equals(Object obj) {  
     if (this == obj)  
    {  
        return true;   
    }  
    // make sure o can be cast to this class  
    if (obj == null || obj.getClass() != getClass())  
    {  
        // cannot cast  
        return false;  
    }           

     Employee e = (Employee) obj;   
     return this.name.equals(e.name)&&this.job.equals(e.job)&&this.salary==e.salary;
 }

 @Override
 public String toString() {
        return name+"\t" +"\t"+  job +"\t"+ salary;
    }
}

3 个答案:

答案 0 :(得分:0)

一旦你发表评论,它就不会被编译,也不会对你的其他程序产生任何影响。

此外,不覆盖Object.equals()方法意味着equals()仅在两个对象是同一实例时才返回true。例如:

int[] data = data; //data to create object
mObject o1 = new mObject(data); //new object from data
mObject o2 = new mObject(data); //another object from the same data
System.out.println(o1.equals(o2)); //prints false even though o1 and o2 contain the same information.

答案 1 :(得分:0)

如果您遗漏equals,它将使用Object.equals方法,仅当两个对象都是同一个实例时才为true

因此,如果您通过不同的对象实例添加相同的数据,则不会添加重复的对象,但可能会添加重复的记录

答案 2 :(得分:0)

无论您做什么或不注释,同一个对象(地址方式)都不能两次添加到一个集合中。 (对于equals()hashCode())的任何合理定义。

当你有两个对象o1o2时,“意思是”相同的东西(具有相同的数据):

如果您发表评论hashCode(),即使HashSet表示这两个对象相同,您(几乎总是)也能将两者都添加到同一equals()(或作为同一HashMap的键。这是因为所有基于散列的数据结构首先通过哈希码比较对象,然后是equals()

如果您在没有评论equals()的情况下注释掉hashCode(),则所有集合的行为就像对象不相等一样。这是因为即使基于哈希的比较在检查equals()之后检查hashCode(),因为即使在hashCode()equals()的正确实现中也可能发生哈希冲突。