java - hashcode() 仅在类对象的情况下才需要吗?

标签 java hashmap hashcode

我正在尝试理解hashcode()。我有两种情况

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

最佳答案

基于哈希的集合需要覆盖 hashCode。

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

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

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

关于java - hashcode() 仅在类对象的情况下才需要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37781901/

相关文章:

java - 如何将给定的数据解析为java对象

java - 我应该如何实现这个 HashMap 的 equals 和 hashCode 方法来表示自动机状态?

java - 评估 Xpath 时的 InputStream 异常

java - 从 XML 文件添加类路径

java - 存储游戏数据的最佳方式? (图像、 map 等)

java - 查找 HashMap 中是否已存在对象

java - BadPaddingException 使用 AES 算法解密 java

java - 如何在Java中使用多维Arraylist或HashMap实现以下数据结构

java - hashCode实现策略

mysql - vb.net 中登录表单的散列密码