HashMap中的对象引用

时间:2016-01-28 19:45:36

标签: java collections

以下代码如何提供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

3 个答案:

答案 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