是否仅在类对象的情况下才需要hashcode()?

时间:2016-06-13 04:38:29

标签: java hashmap hashcode

我想了解hashcode()。我有2个场景

1)使用employee2类对象实现hashmap

2)用原语实现hashMap(虽然它们不是原语)

在类对象的情况下,我理解如果我没有实现hashcode()它每次都会生成一个随机的hashcode(),所以当我检索对象时,每次都会查看一些不同的桶并返回NULL

但是,当我不使用类对象时,为什么不在第二种情况下发生这种情况

代码如下:

package programs;
import java.util.*;

public class employee2
{
  private int empid;
  private String name;
  private String dept;
  public employee2(int empid,String name,String dept){
   this.empid=empid;
   this.name=name;
   this.dept=dept;
 }
 int getEmpid(){
    return this.empid;
 }
 @Override public boolean equals(Object o){
      employee2 e=(employee2)o;
     return getEmpid()==e.empid;
  } 

 @Override public int hashCode() {
    int hash = 7;
    hash = 83 * hash + this.empid;
    return hash;
 } 
  @Override public String toString(){
     return empid+", "+name; 
 }


 public static void main(String args[]){
    //HashMap with employee class objects  
       Map<employee2,String> emap=new HashMap<>();    
       emap.put(new employee2(98446,"Amol Singh","Science"),"good");
       emap.put(new employee2(98446,"Robin Singh","Math"),"very good");

   // I get null if i dont override hashcode()    
       System.out.println(emap.get(new employee2(98446,"Robin Singh","Math"))); 

   // New HashMap without Class objects   
       Map<Integer,String> emap2=new HashMap<>();
       emap2.put(23,"amol");
       emap2.put(2,"Robin");

   // I get correct answer without overriding hashcode()    
       System.out.println(emap2.get(23)); 
   }     
}

4 个答案:

答案 0 :(得分:0)

基于散列的集合需要覆盖hashCode。

如果你不覆盖它,它们将无法正常工作。

Integer拥有自己的hashCode实现,因此在集合中使用它时无需执行任何操作。

但是如果要将它们放在基于散列的集合中,则必须使用您创建的类来执行此操作

答案 1 :(得分:0)

例如,如果您查看String的源代码,那么已经实现了一个非常好的哈希码算法

因此对于Wrapper类和String,永远​​不需要自己编写hashcode方法

答案 2 :(得分:0)

在第二种情况下 - 当您将整数值放入映射时,原始类型转换为其对应的对象包装类。这称为autoboxing。所以你的int转换为已经覆盖hashcodeequals方法的Integer类。看看Integer课程。

在你的第一个案例中,你已经定义了自己的课程。因此,您需要提供自己的equalshashcode方法。

答案 3 :(得分:0)

我找到了这篇文章,这可能有助于解释它。

what-is-the-default-implementation-of-hashcode

据我所知,您正在创建一个新的Object来键入您的地图,JVM提供的hashCode的默认实现是将该对象视为与地图中现有对象的不同。

以下是hashfile的java doc的直接链接。 Object.hashCode()以及与此问题相关的摘要。

  

尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数

故事的寓意是,如果您将HashSets与对象一起使用,则应始终定义自己的hashCode实现。但是有一些警告,例如,如果你使用单身人士。