如何将唯一值添加到哈希图中

时间:2019-02-11 12:24:39

标签: hashmap set

我创建了一个具有几个实例变量的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

}

}

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;
}