-1

我有一个 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;
    }
}
4

3 回答 3

0

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

当您有两个对象o1并且o2“意味着”相同的事物(具有相同的数据)时:

如果您注释掉hashCode(),您(几乎总是)将能够将两者添加到相同的HashSet,即使equals()说这两个对象是相同的(或作为相同的键HashMap)。这是因为所有基于哈希的数据结构都先按哈希码比较对象,然后按equals().

如果您在equals()没有注释的情况下将其注释掉hashCode(),则所有集合都会表现得好像对象不相等。这是因为即使是基于哈希的比较也会在检查equals()后检查hashCode(),因为即使在正确实现hashCode()和时也会发生哈希冲突equals()

于 2012-04-15T18:58:07.057 回答
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.
于 2012-04-15T18:35:47.043 回答
0

如果您省略equals,它将使用该Object.equals方法,该方法true仅在两个对象是同一个实例的情况下。

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

于 2012-04-15T18:38:43.717 回答