我创建了一个具有几个实例变量的Employee类。在初始化对象时,我在Employee属性中给出了相同的值。我从eclipse生成了自己的hashcode和.equals方法。对于将这些元素添加到集合中,效果很好。但是在添加地图时,我会感到困惑。需要一些提示。
班级员工{
String name ;
String address;
public Employee(String name, String address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((address == null) ? 0 : address.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
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 (address == null) {
if (other.address != null)
return false;
} else if (!address.equals(other.address))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
公共类HashcodeEqualsTesting {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, Employee> mymap = new HashMap<>();
Set<Employee> myset = new HashSet<>();
Employee e1 = new Employee("Depak", "India");
Employee e2 = new Employee("Depak", "India");
myset.add(e1);
myset.add(e2);
System.out.println(myset.size()); // shows 1
mymap.put("ABC", e1);
mymap.put("XYZ", e2);
System.out.println(mymap.size()); // why shows 2
}
}
答案 0 :(得分:1)
为澄清您的疑问,根据您的实现,两个Employee对象(即e1和e2)都是相等的,因此将它们仅添加一次即可设置。
但是,在HashMap中,您要添加两个单独的键-ABC和XYZ,因此将计算键的哈希码。 (不是Employee Class),这就是为什么hashMap的大小为2的原因。
您可以参考以下链接,以更深入地了解HashMap的内部工作-https://www.geeksforgeeks.org/internal-working-of-hashmap-java/
答案 1 :(得分:0)
这是因为hashmap允许您存储重复的值。
您正在尝试将“ ABC”映射到e1,将“ XYZ”映射到e2。即使e1等于e2,“ ABC”也不同于“ XYZ”,这就是为什么地图的尺寸为2(现在,地图的ABC-> e1,XYZ-> e2)。
如果要防止向哈希表添加重复的值,则需要遍历整个哈希表,然后再向哈希表中插入任何内容,并检查是否不存在相同的值。
mymap = insertIntoHashMap("ABC",e1,mymap);
public Hashmap<String,Employee> insertIntoHashMap(String key, Employee employee,Hashmap<String,Employee> mymap)
{
boolean insert = true;
for(String employeeKey : mymap.keySet())
{
if(mymap.get(employeeKey).equals(employee))
{
insert = false;
break;
}
}
if(insert)
{
mymap.put(key,employee);
}
return mymap;
}