仅在 class 个对象的情况下才需要 hashcode() 吗?
is hashcode() required only in case of class objects?
我正在努力理解 hashcode()
。我有 2 个场景
1) 使用 employee2 class 个对象实施 hashmap
2) 用基元实现 hashMap
(尽管它们不是基元)
如果是 class 个对象,我知道如果我不实现 hashcode()
它每次都会生成一个随机 hashcode(),所以当我检索对象时,它每次都会查看一些不同的存储桶 return NULL
但是当我不使用 class 个对象时,为什么在第二种情况下没有发生这种情况
代码如下:
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
实现,因此在集合中使用它时无需执行任何操作。
但是如果要将它们放置在基于散列的集合中,则必须对您创建的 类 执行此操作
例如,如果您查看 String 的源代码,还有一个非常好的 hashcode 算法已经实现
所以对于 Wrapper 类 和 String 永远不需要自己写 hashcode 方法
在您的第二种情况下 - 当您将整数值放入映射中时,原始类型转换为其相应的对象包装器 class。这叫做autoboxing. So your int converted to Integer class which already override the hashcode
and equals
method. Take look at Integerclass.
在您的第一个案例中,您已经定义了自己的 class。所以你需要提供你自己的 equals
和 hashcode
方法。
我找到了这个 post,这可能有助于解释它。
what-is-the-default-implementation-of-hashcode
据我了解,您正在创建一个新对象以键入您的地图,而 JVM 提供的 hashCode 的默认实现将该对象视为与地图中现有对象不同的对象。
这是哈希码 java 文档的直接 link。 Object.hashCode() 以及与此问题相关的代码段。
As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects
这个故事的寓意是,如果您将 HashSet 与对象一起使用,您应该始终定义自己的 hashCode 实现。但是有一些注意事项,例如,如果您使用单例。
我正在努力理解 hashcode()
。我有 2 个场景
1) 使用 employee2 class 个对象实施 hashmap
2) 用基元实现 hashMap
(尽管它们不是基元)
如果是 class 个对象,我知道如果我不实现 hashcode()
它每次都会生成一个随机 hashcode(),所以当我检索对象时,它每次都会查看一些不同的存储桶 return NULL
但是当我不使用 class 个对象时,为什么在第二种情况下没有发生这种情况
代码如下:
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
实现,因此在集合中使用它时无需执行任何操作。
但是如果要将它们放置在基于散列的集合中,则必须对您创建的 类 执行此操作
例如,如果您查看 String 的源代码,还有一个非常好的 hashcode 算法已经实现
所以对于 Wrapper 类 和 String 永远不需要自己写 hashcode 方法
在您的第二种情况下 - 当您将整数值放入映射中时,原始类型转换为其相应的对象包装器 class。这叫做autoboxing. So your int converted to Integer class which already override the hashcode
and equals
method. Take look at Integerclass.
在您的第一个案例中,您已经定义了自己的 class。所以你需要提供你自己的 equals
和 hashcode
方法。
我找到了这个 post,这可能有助于解释它。
what-is-the-default-implementation-of-hashcode
据我了解,您正在创建一个新对象以键入您的地图,而 JVM 提供的 hashCode 的默认实现将该对象视为与地图中现有对象不同的对象。
这是哈希码 java 文档的直接 link。 Object.hashCode() 以及与此问题相关的代码段。
As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects
这个故事的寓意是,如果您将 HashSet 与对象一起使用,您应该始终定义自己的 hashCode 实现。但是有一些注意事项,例如,如果您使用单例。