-1

可能重复:
Hashcode 和 equals

我读过很多关于hashcode和平等及其关系的文章。到目前为止,我的理解是默认情况下每个object都有平等和hashcode功能。因为 javaclass有这些功能。现在hashcode意味着它返回一个对象的内存地址。hashcodes默认情况下是唯一的。创建对象时,您将获得唯一的代码。

  • 现在我的问题是,当您按照规则override使用equals函数时,我们需要覆盖hashcode函数..?
  • 那么是不是我们hashcode与equals方法一起实现了该功能,但hascode实现没有用..?
  • 以及如何在hashcode框架中使用.. ?hashmaphashtablecollection

    class person{
    
       string name;
    
       string employer;
    
       boolean equals(Object o){
          person per=(person)o;
          if(per.employer==this.employeer){    
              return true
          }
          return false;
      }  
    
      int hashcode(){
    
          return 0;//what ever i do in hashcode does it really effect any thing..as the equals does                
                   //the comparison for me and gave me the result     
      }
    
    }
    

以及它们如何hascodes用于hashmaphashtable

谢谢,

4

2 回答 2

1

阅读 Joshua Bloch 的“Effective Java”的第 3 章:

http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

它告诉您如何正确编写两者。

你应该知道 Maps 中的键应该是不可变的。在所有支持地图/字典的语言中都是如此:Python、Java、C# 等。

于 2012-06-11T00:28:33.750 回答
1

我对 C# 提出了一个非常相似的问题,我怀疑正确的答案大致相同。

在我看来,底线(有关一些相互冲突的观点,请参阅我的问题的答案)是由您的应用程序域来决定一个对象与另一个对象具有完全相同的属性是否应该意味着它们是“相等的”,或者两个对象是否具有不同的地址(但完全相同的属性值)是不相等的。

我倾向于坚持更常见的定义,即具有相同属性值但不同地址的对象实际上是不同的。如果您觉得需要使用其他定义,那么团队中的每个人都必须非常清楚 a) 那是约定,以及 b) 为什么这是约定,否则很可能会出现错误的错误。

此外,任何时候对象参与依赖哈希码来查找该对象的集合(例如字典)时,哈希码必须在对象参与该集合的持续时间内保持稳定。

于 2012-06-11T00:29:04.910 回答