如果仅在类中重写hashCode()并在Set中使用它,会发生什么情况?

库马尔

这可能不是现实情况,只是好奇地知道会发生什么,下面是代码。

我正在创建一组class对象UsingSet根据Java中的哈希概念,当我第一次添加包含“ a”的对象时,它将创建带有哈希码97的存储桶并将该对象放入其中。同样,当它遇到带有“ a”的对象时,它将在类UsingSet中调用覆盖的哈希码方法,并且将得到哈希码97,那么下一步是什么?

由于尚未覆盖equals方法,因此默认实现将返回false。那么,将具有哈希码97的先前对象保留在同一个存储桶中,将值“ a”的对象保留在何处?还是会创建新的存储桶?有人知道如何将其内部存储吗?

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

class UsingSet {  

  String value;  

  public UsingSet(String value){  
    this.value = value;  
  }  

  public String toString() {  
    return value;  
  }  

  public int hashCode() {  
    int hash = value.hashCode();  
    System.out.println("hashcode called" + hash);  
    return hash;  
  }  

  public static void main(String args[]) {  

    java.util.Set s = new java.util.HashSet();  

    s.add(new UsingSet("A"));  
    s.add(new UsingSet("b"));  
    s.add(new UsingSet("a"));  
    s.add(new UsingSet("b"));   
    s.add(new UsingSet("a"));  

    s.add(new Integer(1));  
    s.add(new Integer(1));  

    System.out.println("s = " + s); 

  }  
}  

输出为:

hashcode called65
hashcode called98
hashcode called97
hashcode called98
hashcode called97
s = [1, b, b, A, a, a]
searchengine27

James Large答案是错误的,或者是误导性的(部分错误也是如此)。我会解释。

如果两个对象根据其equals()方法相等,则它们还必须具有相同的哈希码。如果两个对象具有相同的哈希码,则它们也不必相等。

这是java.util.Object文档中的实际措辞:

  • 如果根据equals(Object)方法,两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
  • 根据equals(java.lang.Object)方法,如果两个对象不相等,则不需要在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

的确,如果两个对象没有相同的哈希,那么它们将不相等。但是,散列不是检查相等性的方法-因此说它是检查相等性的较快方法是非常不正确的。

同样,说hashCode函数是执行任何操作的有效方法,这也是非常错误的。这完全取决于实现,但是随着String变大,字符串的hashCode的默认实现效率很低。它将基于String的每个字符执行计算,因此,如果您使用大型Strings作为键,则效率会非常低;此外,如果您有大量的存储桶。

在地图(HashSet在内部使用HashMap)中,有存储桶,并且每个存储桶中都有一个链表。Java使用hashCode()函数找出它属于哪个存储桶(它实际上将修改哈希,具体取决于存在的存储桶数量)。由于两个对象可能共享相同的哈希,因此接下来将依次遍历链接列表,并检查equals()方法以查看该对象是否重复。根据java.util.Set文档:

不包含重复元素的集合。

因此,如果其hashCode()将其引导到存储桶,其中该存储桶包含.equals()计算为true的Object,则先前的Object被新的Object覆盖。您可能可以在此处查看更多信息:Java HashMap如何使用相同的哈希码处理不同的对象?

不过,一般来讲,如果您覆盖hashCode函数,那么您也将覆盖equals函数是一种很好的做法(如果我没记错的话,如果您选择不这样做,就会违反合同)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果从类文件中删除超级构造函数调用,会发生什么情况?

来自分类Dev

如果在我的java文件中使用了很多@SuppressWarnings,会发生什么情况?

来自分类Dev

如果在crontab文件中使用@reboot reboot,会发生什么情况?

来自分类Dev

iOS:当我从其他类调用重写的方法时,会发生什么情况

来自分类Dev

如果我不在扩展类中调用可选的超级方法或构造函数,会发生什么情况?

来自分类Dev

如果在程序中使用属性而不启用和绑定缓冲区,会发生什么情况?

来自分类Dev

如果不将字体嵌入Flash,会发生什么情况?

来自分类Dev

如果rm在提示中途停止,会发生什么情况?

来自分类Dev

如果不关闭Docker容器,会发生什么情况?

来自分类Dev

使用类函数更改S4对象的“类”时会发生什么情况?

来自分类Dev

如果我们在App Delegate中的didFinishLaunching中返回NO,会发生什么情况

来自分类Dev

在源中更新其基础数据时,结构化流中使用的Spark DataFrame会发生什么情况?

来自分类Dev

如果尝试并最终在方法中返回布尔值,会发生什么情况

来自分类Dev

如果我在Spark中两次缓存相同的RDD,会发生什么情况?

来自分类Dev

如果我在GCC中编译并链接到不需要的库,会发生什么情况?

来自分类Dev

如果未在lambda函数中取消超时处理程序,会发生什么情况?

来自分类Dev

如果我取消选中“软件和更新”中的所有PPA,会发生什么情况?

来自分类Dev

如果在更新过程中安排关机,会发生什么情况?

来自分类Dev

如果我尝试使用SetObject并且已经拥有相同的密钥,会发生什么情况?

来自分类Dev

如果在已经初始化的变量上使用`var`会发生什么情况

来自分类Dev

如果使用ifconfig“启动”网络接口,会发生什么情况?

来自分类Dev

如果使用非对称密钥加密的消息损坏,会发生什么情况?

来自分类Dev

将属性应用于python中的类方法时会发生什么情况?

来自分类Dev

在catch块中返回语句会发生什么情况

来自分类Dev

在Git中删除分支时会发生什么情况

来自分类Dev

虚拟析构函数,如果在派生类中没有析构函数,会发生什么情况?

来自分类Dev

在obj-c中使用计时器时,如果我的方法花费太长时间才能完成,会发生什么情况?

来自分类Dev

如果同一文件中有2个Appdelegate类,将会发生什么情况

来自分类Dev

使用“ + =”在Java中“更改”字符串时会发生什么情况?

Related 相关文章

  1. 1

    如果从类文件中删除超级构造函数调用,会发生什么情况?

  2. 2

    如果在我的java文件中使用了很多@SuppressWarnings,会发生什么情况?

  3. 3

    如果在crontab文件中使用@reboot reboot,会发生什么情况?

  4. 4

    iOS:当我从其他类调用重写的方法时,会发生什么情况

  5. 5

    如果我不在扩展类中调用可选的超级方法或构造函数,会发生什么情况?

  6. 6

    如果在程序中使用属性而不启用和绑定缓冲区,会发生什么情况?

  7. 7

    如果不将字体嵌入Flash,会发生什么情况?

  8. 8

    如果rm在提示中途停止,会发生什么情况?

  9. 9

    如果不关闭Docker容器,会发生什么情况?

  10. 10

    使用类函数更改S4对象的“类”时会发生什么情况?

  11. 11

    如果我们在App Delegate中的didFinishLaunching中返回NO,会发生什么情况

  12. 12

    在源中更新其基础数据时,结构化流中使用的Spark DataFrame会发生什么情况?

  13. 13

    如果尝试并最终在方法中返回布尔值,会发生什么情况

  14. 14

    如果我在Spark中两次缓存相同的RDD,会发生什么情况?

  15. 15

    如果我在GCC中编译并链接到不需要的库,会发生什么情况?

  16. 16

    如果未在lambda函数中取消超时处理程序,会发生什么情况?

  17. 17

    如果我取消选中“软件和更新”中的所有PPA,会发生什么情况?

  18. 18

    如果在更新过程中安排关机,会发生什么情况?

  19. 19

    如果我尝试使用SetObject并且已经拥有相同的密钥,会发生什么情况?

  20. 20

    如果在已经初始化的变量上使用`var`会发生什么情况

  21. 21

    如果使用ifconfig“启动”网络接口,会发生什么情况?

  22. 22

    如果使用非对称密钥加密的消息损坏,会发生什么情况?

  23. 23

    将属性应用于python中的类方法时会发生什么情况?

  24. 24

    在catch块中返回语句会发生什么情况

  25. 25

    在Git中删除分支时会发生什么情况

  26. 26

    虚拟析构函数,如果在派生类中没有析构函数,会发生什么情况?

  27. 27

    在obj-c中使用计时器时,如果我的方法花费太长时间才能完成,会发生什么情况?

  28. 28

    如果同一文件中有2个Appdelegate类,将会发生什么情况

  29. 29

    使用“ + =”在Java中“更改”字符串时会发生什么情况?

热门标签

归档