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

Java hashcode()是否仅在类对象的情况下才需要?,java,hashmap,hashcode,Java,Hashmap,Hashcode,我正在努力理解hashcode()。我有两种情况 1) 使用employee2类对象实现hashmap 2) 使用原语实现hashMap(尽管它们不是原语) 对于类对象,我知道如果我不实现hashcode()它每次都会生成一个随机hashcode(),因此当我检索对象时,它每次都会查看不同的bucket并返回NULL 但是,为什么在第二种情况下,我不使用类对象时不会发生这种情况呢 代码如下: package programs; import java.util.*; public class

我正在努力理解
hashcode()
。我有两种情况

1) 使用employee2类对象实现
hashmap

2) 使用原语实现
hashMap
(尽管它们不是原语)

对于类对象,我知道如果我不实现
hashcode()
它每次都会生成一个随机hashcode(),因此当我检索对象时,它每次都会查看不同的bucket并返回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)); 
   }     
}
打包程序;
导入java.util.*;
公营雇员2
{
私有内部empid;
私有字符串名称;
私人弦乐部;
公共雇员2(int empid、字符串名称、字符串部门){
this.empid=empid;
this.name=name;
this.dept=dept;
}
int getEmpid(){
返回此.empid;
}
@重写公共布尔等于(对象o){
雇员2 e=(雇员2)o;
返回getEmpid()==e.empid;
} 
@重写公共int hashCode(){
int hash=7;
hash=83*hash+this.empid;
返回散列;
} 
@重写公共字符串toString(){
返回empid+“,”+名称;
}
公共静态void main(字符串参数[]){
//带有employee类对象的HashMap
Map emap=newhashmap();
emap.put(新雇员2(98446,“阿莫尔·辛格”,“科学”),“良好”);
emap.put(新雇员2(98446,“罗宾·辛格”,“数学”),“非常好”);
//如果不重写hashcode(),则返回null
System.out.println(emap.get(新员工2)(98446,“罗宾·辛格”,“数学”));
//没有类对象的新HashMap
Map emap2=新的HashMap();
emap2.put(23,“amol”);
emap2.put(2,“罗宾”);
//我在不重写hashcode()的情况下得到正确答案
System.out.println(emap2.get(23));
}     
}

基于哈希的集合需要重写哈希代码

如果你不重写它,它们就不能正常工作

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


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

基于散列的集合需要重写散列代码

如果你不重写它,它们就不能正常工作

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


但是你必须对你所创建的类这样做,如果它们要放在基于散列的集合中

例如,如果你看看String的源代码,还有一个非常好的算法已经实现了


因此,对于包装类和字符串,永远不需要自己编写hashcode方法。例如,如果您查看String的源代码,那么已经实现了一个非常好的hashcode算法


因此,对于包装类和字符串,在第二个场景中,永远不需要自己编写hashcode方法-当您将整数值放入映射时,原语类型将转换为相应的对象包装类。这就是所谓的。因此,您的int转换为整数类,该类已经覆盖了
hashcode
equals
方法。看看课堂


在第一种情况下,您定义了自己的类。因此,您需要提供自己的
equals
hashcode
方法

在第二个场景中,当您将整数值放入映射时,原语类型将转换为相应的对象包装类。这就是所谓的。因此,您的int转换为整数类,该类已经覆盖了
hashcode
equals
方法。看看课堂


在第一种情况下,您定义了自己的类。因此,您需要提供自己的
equals
hashcode
方法

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

据我所知,您正在创建一个新对象,以在映射中输入密钥,JVM提供的哈希代码的默认实现将该对象视为与映射中现有对象不同的对象

这里是指向java文档的hashcode的直接链接。还有这个问题的片段

只要是合理可行的,类对象定义的hashCode方法确实会为不同的对象返回不同的整数


这个故事的寓意是,如果对对象使用hashset,那么应该始终定义自己的hashCode实现。不过也有一些注意事项,例如,如果您使用的是单例。

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

据我所知,您正在创建一个新对象,以在映射中输入密钥,JVM提供的哈希代码的默认实现将该对象视为与映射中现有对象不同的对象

这里是指向java文档的hashcode的直接链接。还有这个问题的片段

只要是合理可行的,类对象定义的hashCode方法确实会为不同的对象返回不同的整数


这个故事的寓意是,如果对对象使用hashset,那么应该始终定义自己的hashCode实现。但是有一些注意事项,例如,如果您使用的是单例。

Integer
使用原语
int
的值作为hashcode。如果您查看Integer类的源代码,它还实现了自己的hashcode方法。@zombie因此
hashcode
vale of Integer是int right的值?@Amol检查Integer类的源代码,并寻找hashcode实现以更好地理解。@zombie。。。是的,它返回哈希代码作为int.的值,但是因为