hashmap的输出

时间:2016-09-19 16:20:38

标签: java hash hashmap

直到现在我对hashmap内部工作非常清楚。但是看到下面的代码片段,我有点困惑。

在以下代码中,我的类的equals()方法始终返回false。因此,我希望HashMap.get() 永远不会找到该类的关键字。

有人可以解释一下。在get方法中,我知道它会计算哈希码,它会找到确切的桶但是等于返回false,它怎么能返回3?

    package com.vikash.Theory.CollectionsFramework;

    public class Emp {

        private String firstName;
        private String lastName;

        public Emp(String firstName,String lastName) {
            this.firstName=firstName;
            this.lastName=lastName;
        }

        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        public int hashCode() {
            return firstName.hashCode()+lastName.hashCode();
        }

        public boolean equals(Object o) {
            return false;
        }
    }


public class Test {

    public static void main(String[] args) {

        Map<Object,Integer> map=new HashMap<Object,Integer>();
        Emp e1=new Emp("Vikash","Mishra");
        Emp e2=new Emp("Mishra","Vikash");
        Emp e3=new Emp("Mishra","Vikash");
        map.put(e1, 1);
        map.put(e2, 2);
        map.put(e3, 3);
        /*e2.setFirstName("Vikash");
        e2.setLastName("Mishra");*/
        System.out.println("Size of the map is:"+map.size());
        System.out.println(map.get(e3)); } }

2 个答案:

答案 0 :(得分:2)

HashMap的源代码揭示了所有:

322      if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
323                 return e.value;

e.key == key测试key.equals(e.key) 之前测试equals()

一般来说,有一个bug equals()会导致Java中出现各种令人困惑的行为,所以避免这样做是非常明智的。 x.equals(x)合同的一部分是true应始终为setlocale(LC_TIME, 'fra_fra');

答案 1 :(得分:-2)

1)在你的hashcode()中你没有使用emp class的equals()方法

2)相反,你的hashcode()使用已经实现的String类的hashcode()BECAUSE firstname和lastname是string类型。

3)在你的情况下,即使两个键都相同,它们也会有不同的hashcode() 因为你没有定义当密钥相同时它们应该具有相同的hashcode()

4)equals()方法不是在hashcode()中自动调用的,而是必须显式调用以实现hashcode()并最终以 DESIRED WAY

的方式调用hashmap

这就是我认为可能是甚至可以正常工作的原因 如果你有一个错误的equals()方法