我有一个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;
}
}
答案 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()
)的任何合理定义。
当你有两个对象o1
和o2
时,“意思是”相同的东西(具有相同的数据):
如果您发表评论hashCode()
,即使HashSet
表示这两个对象相同,您(几乎总是)也能将两者都添加到同一equals()
(或作为同一HashMap
的键。这是因为所有基于散列的数据结构首先通过哈希码比较对象,然后是equals()
。
如果您在没有评论equals()
的情况下注释掉hashCode()
,则所有集合的行为就像对象不相等一样。这是因为即使基于哈希的比较在检查equals()
之后检查hashCode()
,因为即使在hashCode()
和equals()
的正确实现中也可能发生哈希冲突。