以下代码如何提供Employee对象e2作为员工的价值,即使我没有将e2添加到HashMap。我想知道e2是如何被引用的。
import java.util.HashMap;
public class Employee {
int phno;
String name;
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee e1=new Employee();
e1.name="niks";
e1.phno=9032944566;
HashMap<Employee,String> m=new HashMap();
m.put(e1, "employee1");
Employee e2=new Employee();
e2.name="niks";
e2.phno=9032944566;
System.out.println("value of e2:"+m.get(e2));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + phno;
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 (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (phno != other.phno)
return false;
return true;
}
}
输出 e2的值:employee1
答案 0 :(得分:2)
它们具有不同的引用,但它们的值是等于,因为您重写了equals方法。
方法get()要做的是调用 haschode 和 equals 方法。 如果Map中两个Objects的hashCode返回相同的数字,那么将调用equals来确定它们是否相等......
Employee newReference = new Employee();
Employee newReference2 = new Employee();
newReference.name="MyName";
newReference2.name="MyName";
map.put(newReference);
map.get(newReference2); //key.equals(key2)
答案 1 :(得分:1)
这里有两点需要注意:
1)Employee对象的两个实例 - e1&amp; e2 相等 - 因为它们符合Employee类的 equals()和 hashcode()方法中定义的条件。
2)散列图不能有重复的密钥。因此,只要使用相同的键(e2,与e1是同一个对象)调用 put(),它就会在地图中被替换。
答案 2 :(得分:0)
因为他们的phno号和名称是相同的,他们创建相同的哈希码
测试此代码以查看我的意思
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
System.out.println("res : "+result);
result = prime * result + phno;
System.out.println("res : "+result);
return result;
}
输出:
res : 3381378
res : 104823717
res : 3381378
res : 104823717
value of e2:employee1