覆盖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方法。
分享到:
相关推荐
6. **重写equals()和hashCode()方法(Overriding equals() and hashCode())**: 代码展示了如何正确实现这两个方法以遵循合同,尤其是在实现集合类时的注意事项。 7. **接口与抽象类(Interfaces vs Abstract ...
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
2. **重写equals()和hashCode()**:Bloch建议当重写equals()方法时,也应同时重写hashCode(),以确保对象在散列结构(如HashSet或HashMap)中的行为正确。 3. **枚举代替常量类**:书中推荐使用枚举类型替代传统的...
5. **重写equals()时务必重写hashCode()**:当一个类重写了equals()方法,应确保同时重写hashCode(),以保持等价关系的合同。这确保了对象在哈希表(如HashMap)中的正确行为。 6. **避免在公共API中使用浮点数比较...
4. **equals()与hashCode()**:遵循 equals 和 hashCode 的合同,当两个对象相等时,它们的hashCode值必须相同。同时,如果两个对象不相等,则它们的hashCode值应尽可能不同,以优化哈希表性能。 5. **泛型**:使用...
5. **equals()与hashCode()**:Item 8 "总是重写equals并重写hashCode" 是关于对象相等性的基础,理解它们的正确实现对于集合类的使用至关重要。 6. **构造器**:Item 1 "提供私有的构造器来创建不可实例化的类" 和...
还有许多其他的知识点,如“利用equals()和hashCode()的一致性”、“重写clone()需谨慎”、“优先使用私有构造器或枚举来替代单例”等,都可以在源代码中找到实际应用的例子。 总之,《有效Java》第三版的源代码为...
1. **覆写equals时遵守通用规定**:重写`equals()`时,应遵循“ Reflexive、Symmetric、Transitive、Consistency 和 Non-null”五原则,同时必须与`hashCode()`一起覆写。 2. **覆写hashCode**:确保相等的对象有...
5. **equals()与hashCode()**:遵循 equals 和 hashCode 同步原则,确保当两个对象相等时,它们的哈希码也必须相等。同时,书中指出重写这两个方法时应避免出现循环引用。 6. **继承(Inheritance)**:强调慎用...
2. **重写equals()与hashCode()** - **约定**:如果一个类重写了`equals()`,那么也应该重写`hashCode()`,以保持一致性。 - **正确实现**:`equals()`应满足对称性、传递性、一致性和非空性等原则。 3. **构造器...
3. **重写`equals()`必须重写`hashCode()`**:确保当两个对象相等时,它们的哈希码也相等,遵循对象平等关系的约定。 4. **始终覆盖`toString()`**:提供对象的可读字符串表示,这对于调试和日志记录非常有用。 5....
- Item9:当覆盖equals时,必须同时覆盖hashcode,以保持哈希表的行为一致性。 - Item10:toString方法应返回对象状态的简洁表示,便于调试和日志记录。 - Item11:谨慎覆盖clone方法,因为它涉及到对象的深拷贝...
4. 对于任何可能会暴露对象内部状态的方法(如toString、hashCode和equals),要确保它们不依赖于可变状态。 5. 如果类包含其他对象引用,确保这些对象也是不可变的,或者至少是不可变的视图。 例如,Java的String...
21. **理解并使用equals()和hashCode()合同**:equals()和hashCode()必须一致,如果两个对象相等,它们的hashCode必须相同。 22. **使用StringBuilder而非StringBuffer进行字符串连接**:在单线程环境中,...
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...
它涉及的主题包括枚举类型、泛型、匿名内部类、静态导入、迭代器、equals()和hashCode()的正确实现,以及性能优化策略。 4. **《Struts 2入门》(starting-struts-2)**:Struts 2是一个流行的Java Web框架,用于构建...
以上只是《Effective Java》一书中部分重要知识点的概述,实际源代码中还包含了更多关于构造器、equals()与hashCode()、比较器、懒初始化等主题的示例。通过学习和理解这些源代码,开发者能够提升Java编程的技能,写...