我编写了以下程序,无法理解输出。
package com.demo.strings;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
class Emp
{
private int empNo;
private String empName;
public Emp(int empno, String empname)
{
this.empNo=empno;
this.empName=empname;
}
public int getEmpNo() {
return empNo;
}
public void setEmpNo(int empNo) {
this.empNo = empNo;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public boolean equals(Object obj)
{
if(obj != null && obj instanceof Emp)
{
String name = ((Emp)obj).getEmpName();
if(name.equals(this.getEmpName()))
{
return true;
}
}
return false;
}
public int hashcode()
{
return (this.hashCode()+1);
}
}
public class StringDemo {
public static void main(String[] args) {
Emp e1 = new Emp(1,"Stack");
Emp e2 = new Emp(1,"Stack");
Map<Integer,Emp> empMap = new HashMap<Integer,Emp>();
empMap.put(1,e1);
empMap.put(2,e2);
System.out.println(empMap.size());
System.out.println("Both objects are equal: "+e1.equals(e2));
}
}
输出:2两个对象相等:true
我已经覆盖了equals
和hashcode
,所以Map
应该只存储一个物体。但它似乎存储了它们。 equals
和hashcode
被覆盖的方式错了吗?任何人都可以解释我如何解决这个问题?
首先阅读here的基础知识
您正在使用HashMap。它只存储一个唯一键。
Map<Integer,Emp> empMap = new HashMap<Integer,Emp>();
empMap.put(1,e1);
empMap.put(2,e2);
在上面三行中,您尝试使用不同的键(1和2)存储两个元素。所以你得到输出为“2两个对象是相等的:真”
//Try this
Map<Integer,Emp> empMap = new HashMap<Integer,Emp>();
empMap.put(1,e1);
empMap.put(1,e2);
在这种情况下,第二次放置将用e1
替换第一个值e2
。但是当你重写equals来比较empName
字段时,它输出为“1两个对象都相等:true”
如果你将e1
和e2
的声明更改为
Emp e1 = new Emp(1,"Stack One");
Emp e2 = new Emp(1,"Stack Two");
输出将是
1
Both objects are equal: false