我编写了以下程序,但无法理解输出。
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
被覆盖的方式是错误的吗?任何人都可以解释我如何解决这个问题吗?
答案 0 :(得分:1)
首先阅读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两个对象都相等:为真”
如果您将e1
和e2
的声明更改为
Emp e1 = new Emp(1,"Stack One");
Emp e2 = new Emp(1,"Stack Two");
输出
1
Both objects are equal: false