2016-12-27 104 views
-6

需要对散列码和hashcode中的equals方法提出一些问题和解释。下面是问题:何时覆盖hashcode和equals方法在java中

  1. 什么时候在put或get期间调用hashcode和equals会被调用?
  2. 当我们存储自定义对象时,我在每个教程中发现我们需要重写hashcode。但如果我不重写,那么它会产生相同的结果。除了当我使用新的运营商。下面是示例程序:

我将员工对象存储到散列映射中,然后我没有重写散列码和等于方法,那么代码按预期工作。

Employee e1= new Employee("ram", 1000); 
     Employee e2= new Employee("sai", 1001); 
     Employee e3= new Employee("krishna", 1002); 


     System.out.println("e1.hashCode() : "+e1.hashCode()); 
     System.out.println("e2.hashCode() : "+e2.hashCode()); 
     System.out.println("e3.hashCode() : "+e3.hashCode()); 


     Map<Employee, String> map= new HashMap<Employee, String>(); 

     map.put(e1, "employee1"); 
     map.put(e2, "employee2"); 
     map.put(e3, "employee3");   


     for (Entry<Employee, String> entry : map.entrySet()) 
     { 
      System.out.println(entry.getKey().getName() +"-"+entry.getKey().getid() + "-" + entry.getValue()); 
     } 

     System.out.println(map.get(e3));   
     System.out.println(map.get(new Employee("krishna", 1002))); 
  • 当你重写equals,需要被照顾什么东西。
  • 当您重写散列码时,需要注意哪些事项。
  • 当您只覆盖等于,那么默认哈希码将如何表现。
  • 当你只重写哈希码,那么该如何默认平等的行为。*
  • +2

    伙计,这就像你甚至没有尝试。这些问题在谷歌第一页的任何结果中回答为“java equals hashCode”。 –

    +0

    尝试再次添加相同的员工,但作为新的实例:'员工e4 =新员工(“克里希纳”,1002);'然后它会停止工作,因为你期望。 – RadekJ

    +0

    除了作为(其他许多人)的副本之外,你的问题太广泛了,而且在问你问题之前,你显然还没有充分研究过这个问题(例如用Google搜索答案)。 –

    回答

    0

    阅读本Article了详细的解释。

    总之,即使你没有在你的类中实现hashCode和equals,也有一个从Object类继承的默认实现。这就是为什么你没有看到任何问题。

    但是使用Collections时肯定会遇到问题。

    -1

    Hashcode和equals需要最小化冲突。您的目标是以这种方式实现散列码,以便存储桶中只有一个条目。 Equals将帮助您区分哈希码相同的两个条目。散列码和等于一起决定两个密钥是否相同。所以如果这些都没有照顾,两个不同的自定义对象可能被视为相同的关键,​​第二个将替换地图中的第一个。