`

effective------equals , hashCode

    博客分类:
  • J2SE
阅读更多
覆盖equals时总是覆盖hashCode
:你都认为他们是同一个东西了,当然应该放到同一个桶中。。。

public boolean equals(Object o){
   if(o == this) return true;
   if(!(o instanceof PhoneNumber))return false;
   PhoneNumber pn = (PhoneNumber)o;
   return pn.lineNumber == lineNumber
        && pn.prefix == prefix
        && pn.areaCode == areaCode;
}


下面是构建高效hashCode的原则:

1.把某个非零的常数值,比如17,保存在一个名为result的int类型的变量中。

2。 对于对象的每个关键域f(指equals方法中涉及的每个域),完成以下步骤:
  a. 为该域计算int类型的散列码c:
     i.  如果该域是boolean类型,则计算(f?1:0).
     ii. 如果该域是byte,char,short,int类型,则计算(int)f.
     iii. 如果该域是long类型,则计算(int)(f^(f>>>32)).
     iv. 如果该域是float类型,则计算Float.floatTointBits(f).
     v.如果该域是double类型,则计算Double.doubleToLongBits(f),然后按照步骤iii,为得到的long类型值计算散列值。
      vi.如果该域是一个对象引用,并且该类的equals方法通过递归调用equals的方法来比较这个域,则同样为这个域递归调用hashCode,如果需要更复杂的比较,则为这个域计算一个"范式",然后针对这个范式调用hashCode, 如果数组域的值为null,则返回0.
      vii. 如果该域是一个数组,则要把每一个元素当作单独的域来处理,也就是说,递归地应用上述规则,对每个重要的元素计算一个散列码,然后根据步骤2.b 中的做法吧这些散列值组合起来。如果数组域中的每个元素都很重要,可以利用发行版本1.5中增加的一个Arrays.hashCode方法。

分享到:
评论

相关推荐

    effective-java 配套代码

    6. **重写equals()和hashCode()方法(Overriding equals() and hashCode())**: 代码展示了如何正确实现这两个方法以遵循合同,尤其是在实现集合类时的注意事项。 7. **接口与抽象类(Interfaces vs Abstract ...

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

    Effective-Java-2nd-Edition-(May-2008).zip_effective java

    2. **重写equals()和hashCode()**:Bloch建议当重写equals()方法时,也应同时重写hashCode(),以确保对象在散列结构(如HashSet或HashMap)中的行为正确。 3. **枚举代替常量类**:书中推荐使用枚举类型替代传统的...

    Effective-Java读书笔记

    5. **重写equals()时务必重写hashCode()**:当一个类重写了equals()方法,应确保同时重写hashCode(),以保持等价关系的合同。这确保了对象在哈希表(如HashMap)中的正确行为。 6. **避免在公共API中使用浮点数比较...

    Effective-Java:Effective Java中文版第二版示例代码

    4. **equals()与hashCode()**:遵循 equals 和 hashCode 的合同,当两个对象相等时,它们的hashCode值必须相同。同时,如果两个对象不相等,则它们的hashCode值应尽可能不同,以优化哈希表性能。 5. **泛型**:使用...

    java优秀源码-Effective-Java-Concepts:Java源代码可以强化概念,我正在从JoshuaBloch的出色著作“Eff

    5. **equals()与hashCode()**:Item 8 "总是重写equals并重写hashCode" 是关于对象相等性的基础,理解它们的正确实现对于集合类的使用至关重要。 6. **构造器**:Item 1 "提供私有的构造器来创建不可实例化的类" 和...

    Effective-java-3e-source-code:有效Java第三版的源代码,并进行了必要的补充以使其可运行

    还有许多其他的知识点,如“利用equals()和hashCode()的一致性”、“重写clone()需谨慎”、“优先使用私有构造器或枚举来替代单例”等,都可以在源代码中找到实际应用的例子。 总之,《有效Java》第三版的源代码为...

    Effective Java第三版1

    1. **覆写equals时遵守通用规定**:重写`equals()`时,应遵循“ Reflexive、Symmetric、Transitive、Consistency 和 Non-null”五原则,同时必须与`hashCode()`一起覆写。 2. **覆写hashCode**:确保相等的对象有...

    java源码总结-Effective-Java-3E:有效Java第三版的源代码示例和摘要的回购

    5. **equals()与hashCode()**:遵循 equals 和 hashCode 同步原则,确保当两个对象相等时,它们的哈希码也必须相等。同时,书中指出重写这两个方法时应避免出现循环引用。 6. **继承(Inheritance)**:强调慎用...

    effective-java:阅读《有效的Java》一书

    2. **重写equals()与hashCode()** - **约定**:如果一个类重写了`equals()`,那么也应该重写`hashCode()`,以保持一致性。 - **正确实现**:`equals()`应满足对称性、传递性、一致性和非空性等原则。 3. **构造器...

    effective-java:我正在关注Joshua Bloch撰写的有效Java一书

    3. **重写`equals()`必须重写`hashCode()`**:确保当两个对象相等时,它们的哈希码也相等,遵循对象平等关系的约定。 4. **始终覆盖`toString()`**:提供对象的可读字符串表示,这对于调试和日志记录非常有用。 5....

    effective java 读书笔记

    - Item9:当覆盖equals时,必须同时覆盖hashcode,以保持哈希表的行为一致性。 - Item10:toString方法应返回对象状态的简洁表示,便于调试和日志记录。 - Item11:谨慎覆盖clone方法,因为它涉及到对象的深拷贝...

    effectiveJava课件分享

    4. 对于任何可能会暴露对象内部状态的方法(如toString、hashCode和equals),要确保它们不依赖于可变状态。 5. 如果类包含其他对象引用,确保这些对象也是不可变的,或者至少是不可变的视图。 例如,Java的String...

    Effective.Java3rd.zip

    21. **理解并使用equals()和hashCode()合同**:equals()和hashCode()必须一致,如果两个对象相等,它们的hashCode必须相同。 22. **使用StringBuilder而非StringBuffer进行字符串连接**:在单线程环境中,...

    Effective Java 3rd edition(Effective Java第三版英文原版)附第二版

    Item 11: Always override hashCode when you override equals Item 12: Always override toString Item 13: Override clone judiciously Item 14: Consider implementing Comparable 4 Classes and Interfaces Item...

    java书籍

    它涉及的主题包括枚举类型、泛型、匿名内部类、静态导入、迭代器、equals()和hashCode()的正确实现,以及性能优化策略。 4. **《Struts 2入门》(starting-struts-2)**:Struts 2是一个流行的Java Web框架,用于构建...

    Java-Effective:Java Effective 2nd Edition书中的源代码

    以上只是《Effective Java》一书中部分重要知识点的概述,实际源代码中还包含了更多关于构造器、equals()与hashCode()、比较器、懒初始化等主题的示例。通过学习和理解这些源代码,开发者能够提升Java编程的技能,写...

Global site tag (gtag.js) - Google Analytics