Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hashcode和contract相等,反之亦然_Java_Equals_Hashcode - Fatal编程技术网

Java hashcode和contract相等,反之亦然

Java hashcode和contract相等,反之亦然,java,equals,hashcode,Java,Equals,Hashcode,我知道合同上说如果两个对象相等,那么它们应该返回相同的哈希代码。也就是说,可以将这些对象放在同一个哈希桶中,并改进与哈希代码相关的收集函数。然后再次解释为什么它说如果两个对象有相同的散列码,它们不应该总是相等的。我的意思是,如果合同中是真的,我们应该说,如果两个对象相等,它们可以返回相同的哈希代码,但这不是强制性的。医生是对的,你搞混了 两个相等的对象必须具有相同的哈希代码。 二 具有相同哈希代码的对象可能不相等。 为了 为了提高哈希表的性能,通常需要两个不相同的对象 等于尽可能多地使用不同的哈

我知道合同上说如果两个对象相等,那么它们应该返回相同的哈希代码。也就是说,可以将这些对象放在同一个哈希桶中,并改进与哈希代码相关的收集函数。然后再次解释为什么它说如果两个对象有相同的散列码,它们不应该总是相等的。我的意思是,如果合同中是真的,我们应该说,如果两个对象相等,它们可以返回相同的哈希代码,但这不是强制性的。医生是对的,你搞混了

两个相等的对象必须具有相同的哈希代码。 二 具有相同哈希代码的对象可能不相等。 为了 为了提高哈希表的性能,通常需要两个不相同的对象 等于尽可能多地使用不同的哈希代码。 例如,以下始终是hashCode的有效实现:


没有。医生是对的,你搞混了

两个相等的对象必须具有相同的哈希代码。 二 具有相同哈希代码的对象可能不相等。 为了 为了提高哈希表的性能,通常需要两个不相同的对象 等于尽可能多地使用不同的哈希代码。 例如,以下始终是hashCode的有效实现:


如果两个相同的哈希代码必须来自同一个对象,那么哈希就不会那么安全。从技术上讲,可以根据散列计算出密码是什么。这至少在安全意义上会破坏哈希代码的用途


对于非安全散列,如果您可以让每个唯一值生成一个唯一散列,那么您就可以解决一个未解决的计算问题。

如果两个相同的散列代码必须来自同一对象,那么散列就不会那么安全。从技术上讲,可以根据散列计算出密码是什么。这至少在安全意义上会破坏哈希代码的用途

对于非安全散列,如果您可以让每个唯一值生成一个唯一散列,那么您就可以解决一个未解决的计算问题。

一个HashMap可以为每个bucket存储多个条目,选择哪个bucket取决于hashcode。HashMap通过使用hashcode来标识bucket来查找一个键的条目,然后等于在该bucket中查找匹配的键

综上所述,应该清楚的是,您可以使用重复的hashcode,但问题不大。如果多个对象具有相同的hashcode,但所有内容仍将正常工作,则会影响HashMap的性能。HashMap可以在每个bucket中存储多个条目,选择哪个bucket取决于hashcode。HashMap通过使用hashcode来标识bucket来查找一个键的条目,然后等于在该bucket中查找匹配的键


综上所述,应该清楚的是,您可以使用重复的hashcode,但问题不大。如果多个对象具有相同的hashcode,但所有内容都将正常工作,则会影响hashmap的性能

单向函数


:某些输入值对象可能会生成相同的哈希代码。

哈希函数通常是

单向函数

:某些输入值对象可能会生成相同的哈希代码

我的意思是,如果这在合同中是真的,我们应该说,如果两个物体相等,它们可能会返回相同的结果 哈希代码,但不是必需的

不,不应该。这是因为,无论何时搜索对象(比如在HashMap或HashSet中),首先都会根据hashCodeNOTE进行搜索:-对于ArrayList或LinkedList,hashCode不用于搜索。它们不是基于散列的集合,如果这两个对象具有相同的散列码,它将移动到equals方法来比较对象本身

现在假设如果上述语句为真,那么这些对象的第一个测试本身将失败。也就是说,如果允许两个相等的对象具有不同的hashcode,那么在搜索特定hashcode时,它将不会返回正确的结果,因此测试将不会继续使用equals方法,并声明这些对象不相等,即使您希望它们相等

现在让我们来看第二句话:

如果两个对象具有相同的哈希代码,则它们不应总是相等的

让我们这样理解:-因为为每个对象生成的hashCode类型为int,所以您最多可以生成2^32个唯一的hashCode。所以,想象一下,如果你想存储更多的对象,会发生什么。在这种情况下,必须有两个不同对象的碰撞。所以,除了将相同的哈希代码分配给两个不同的对象之外,别无选择。因此,上述说法是合理的

因此,从上述解释中,有两件事是非常清楚的:-

两个相同的对象必须具有相同的哈希代码。 两个不同的对象可以具有相同的哈希代码。 有关此主题的更多详细信息,请参见下面的链接c 请给出比这更好的解释:-

我的意思是,如果这在合同中是真的,我们应该说,如果两个物体相等,它们可能会返回相同的结果 哈希代码,但不是必需的

不,不应该。这是因为,无论何时搜索对象(比如在HashMap或HashSet中),首先都会根据hashCodeNOTE进行搜索:-对于ArrayList或LinkedList,hashCode不用于搜索。它们不是基于散列的集合,如果这两个对象具有相同的散列码,它将移动到equals方法来比较对象本身

现在假设如果上述语句为真,那么这些对象的第一个测试本身将失败。也就是说,如果允许两个相等的对象具有不同的hashcode,那么在搜索特定hashcode时,它将不会返回正确的结果,因此测试将不会继续使用equals方法,并声明这些对象不相等,即使您希望它们相等

现在让我们来看第二句话:

如果两个对象具有相同的哈希代码,则它们不应总是相等的

让我们这样理解:-因为为每个对象生成的hashCode类型为int,所以您最多可以生成2^32个唯一的hashCode。所以,想象一下,如果你想存储更多的对象,会发生什么。在这种情况下,必须有两个不同对象的碰撞。所以,除了将相同的哈希代码分配给两个不同的对象之外,别无选择。因此,上述说法是合理的

因此,从上述解释中,有两件事是非常清楚的:-

两个相同的对象必须具有相同的哈希代码。 两个不同的对象可以具有相同的哈希代码。 下面的链接中有关于此主题的更多详细信息,没有什么比此更好的解释了:-


两个相同的苹果的价格应该是一样的,那就是一枚金币。然而,两件价值一枚金币的物品不一定是相同的苹果。两个相同的苹果应该价值相同,即一枚金币。然而,两件价值1金币的东西不一定是相同的苹果。我已经编写了一个示例程序来测试你提到的东西。我只重写A的equals方法,而不是哈希代码。但低于真实值。你能解释一下out put true retruns的原因吗?因为我从来没有为列表添加a3,正如你提到的,这些对象具有不同的哈希代码,并且由于列表中没有找到a3哈希代码,所以应该返回false,对吗?a1=新的A;a1.setNamea;A a2=新的A;a2.setNamea;a3=新的A;a3.setNamea;列表=新的ArrayList;list.adda1;list.adda2;System.out.printlnlist.containsa3@哈沙纳德。。很抱歉没有提到这一点,在列表的情况下,哈希代码不用于搜索。它用于映射-HashMap、LinkedHashMap、Hashtable或HashSet。这就是它起作用的原因。我已相应地编辑了我的答案我回答的第一部分。@HarshanaD。。尝试使用相同的代码,但Set=new HashSet;,而不是ArrayList。您将无法获得该值的真实值。是的,在这种情况下,它将返回false。因此,它类似于集合集将检查a3的哈希代码是否驻留在该集合中。由于这3个对象具有不同的哈希代码,因此即使对象状态为相等,也会返回false。因此,如果我们使这些对象的哈希代码相同,集合将直接转到a3哈希代码桶,并检查该对象是否正确驻留?这是在集合中查找元素的算法。首先转到该散列码桶,如果没有找到,则迭代集合中的每个元素并检查散列码是否匹配?因此,一旦覆盖散列码,即使从技术上讲该对象不在该集合中,它也会为contains返回true。但是根据equals的契约,这种行为是正确的,因为contains需要检查对象状态的相似性,而不是对象在物理上是否不同,知道吗?我已经编写了一个示例程序来测试您提到的内容。我只重写A的equals方法,而不是哈希代码。但低于真实值。你能解释一下out put true retruns的原因吗?因为我从来没有为列表添加a3,正如你提到的,这些对象具有不同的哈希代码,并且由于列表中没有找到a3哈希代码,所以应该返回false,对吗?a1=新的A;a1.setNamea;A a2=新的A;a2.setNamea;a3=新的A;a3.setNamea;列表=新的ArrayList;list.adda1;list.adda2;System.out.printlnlist.containsa3@哈沙纳德。。很抱歉没有提到这一点,在列表的情况下,哈希代码不用于搜索。它用于映射-HashMap、LinkedHashMap、Hashtable或HashSet。这就是它起作用的原因。我已相应地编辑了我的答案我回答的第一部分。@HarshanaD。。尝试使用相同的代码,但Set=new HashSet;,而不是ArrayList。您将无法获得该值的真实值。是的,在这种情况下,它将返回false。因此,它就像集合集将检查
a3的哈希代码驻留在该集合中。由于这3个对象具有不同的哈希代码,因此即使对象状态为相等,也会返回false。因此,如果我们使这些对象的哈希代码相同,集合将直接转到a3哈希代码桶,并检查该对象是否正确驻留?这是在集合中查找元素的算法。首先转到该散列码桶,如果没有找到,则迭代集合中的每个元素并检查散列码是否匹配?因此,一旦覆盖散列码,即使从技术上讲该对象不在该集合中,它也会为contains返回true。但根据平等契约,这种行为是正确的,因为包容需要检查对象状态的相似性,而不是对象是否是物理上不同的东西,知道吗?
public int hashCode() { 
  return 0;
  // clearly all equal objects have the same hash code -- 0
  // but it's totally okay that unequal objects also have the same hash code
}