Object规范[JavaSE6]:
在应用程序执行期间,对同一样对象调用多次,hashCode方法必须始终如一地返回同一个整数,在同一个应用程序多次执行过程中,每次执行所返回的整数可以不一致
如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法必须产生相同的整数结果
如果两个对象更具equals方法比较是不相等的,那么调用hashCode方法,不一定要产生不同的结构,但是程序员应该知道,给不相等的对象产生不同的整数结果,有可能提高Hash Table的性能.
1.以下创建一个没有自定义hashCode()方法的Boy类
package com.perficient.basic;
import java.util.HashSet;
import java.util.Set;
public class Boy {
private String name;
private int age;
public Boy(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and Setters......
public boolean equals(Object o){
if (this == o) return true;
if (!(o instanceof Object)) return false;
final Boy other = (Boy)o;
if (this.name.equals(other.getName()) && this.age==other.getAge())
return true;
else
return false;
}
}
2.在main()方法中向HashSet中增加两个相等的对象
public static void main(String[] args){
Set<Boy> boys = new HashSet<Boy>();
Boy boy1 = new Boy("James", 28);
Boy boy2 = new Boy("James", 28);
boys.add(boy1);
boys.add(boy2);
System.out.println("The total number of boy is:" + boys.size());
}
结果会显示
The total number of boy is:2
3.增加如下hashCode()方法:
public int hashCode(){
int result=18;
result = 31* result + age;
return result;
}
再次运行,显示The total number of boy is:1
总结:覆盖equals时总要覆盖hashCode,并且使Equals()为True的对象,返回相同的hashCode
参考资料:<Effective Java(第二版)>,<Java面向对象编程>
分享到:
相关推荐
在Java编程中,当我们重写`equals()`方法时,通常也需要重写`hashCode()`方法。这是因为`equals()`和`hashCode()`方法在Java集合框架中扮演着重要的角色,特别是在使用`HashMap`、`HashSet`等基于哈希表的集合类时。...
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
- 为了避免哈希冲突带来的性能问题,在覆盖`equals()`方法的同时,通常也需要覆盖`hashCode()`方法。 #### 实现示例 以下是一个简单的类`Person`,展示了如何正确覆盖`equals()`和`hashCode()`方法: ```java ...
7. **条目7:覆盖equals时总要覆盖hashCode(Override equals() and hashCode() in pairs)** 当重写equals()方法时,必须同时重写hashCode(),以确保一致性,否则会影响集合类的行为。 8. **条目8:始终重写...
为了实现元素的唯一性,`Set`接口要求覆盖`equals`方法,使其能够根据元素的实际内容来进行比较。 - **内容比较**: 在`Set`接口的不同实现中,通常会根据元素的属性或内容来进行比较。例如,在`String`类中,`...
- **一致性**:在覆盖`equals()`方法时,也需要确保同时覆盖`hashCode()`方法,并且两个方法的实现要保持一致,以避免潜在的哈希冲突问题。 - **性能考量**:在设计`hashCode()`方法时,应尽可能选择分布均匀的哈希...
2. 对于不相等的对象,`equals`返回`false`时,`hashCode`应尽可能不同,以减少哈希冲突。 3. `equals`方法的重写应遵循自反性、对称性、传递性和一致性原则。 4. 如果重写了`equals`,那么通常也应重写`hashCode`,...
在Java编程语言中,`hashCode`和`equals`方法是非常重要的概念,它们在处理对象的比较、存储以及检索时扮演着关键角色。本文将深入探讨这两个方法之间的区别,并通过具体例子来说明它们的重要性。 #### 一、`equals...
首先,根据键的 `hashCode` 定位到对应的桶,然后遍历桶中的条目,如果找到一个条目的键与要插入的键 `equals` 并且哈希值相同,那么就会覆盖旧的值,否则会在桶中添加新的条目。如果两个键的 `equals` 返回 true 但...
因此,重写 `equals()` 时务必考虑 `hashCode()`。不一致的 `equals()` 和 `hashCode()` 实现可能导致违反哈希表的语义,影响程序的正确性和性能。Java 文档明确指出,如果你重写了 `equals()`,也应该重写 `...
4. **覆盖两者**:如果只覆盖 `equals()` 不覆盖 `hashCode()`,可能会导致集合行为异常,因为哈希表依赖于两者的一致性。 在具体实现时,可以使用对象属性的哈希码组合来生成自定义的哈希码,例如: ```java @...
jv-equals-hashcode 给定的类—矩形。 覆盖它的方法equals()和hashCode()所以equals()通过其字段(颜色,宽度和长度equals()比较Rectangle对象。 还要确保hashCode()遵循equals和hashcode之间的约定。
此外,Object 类的设计是为了扩展,它提供了一些非 final 方法,如 equals、hashCode、toString、clone 和 finalize,这些方法都有通用的约定,需要在子类中被覆盖(override)。如果不遵守这些约定,依赖这些约定的...
- 如果类的实例不会与其他类型对象相等(即没有覆盖`equals()`),则无需重写`hashCode()`。 综上所述,正确实现`hashCode()`方法对于优化Java应用程序的性能和正确性至关重要。在设计和实现类时,必须考虑到`...
Joshua Bloch 所著《Effective Java 第二版》一书摘要这是我对 Joshua Bloch 所著《Effective Java 第 2 ... 覆盖equals时遵守一般约定9.重写equals时务必重写hashCode10. 始终覆盖toString11.明智地覆盖克隆12.考虑实
5. **覆盖`hashCode()`**:如果两个对象根据`equals()`方法比较相等,它们的`hashCode()`方法必须返回相同的值。反之不成立,因为不同的对象可能有相同的`hashCode()`。 遵循这些准则,我们可以编写符合预期的`...
五、覆盖equals()时的注意事项 当重写equals()方法时,务必同时重写hashCode()方法,以保持equals()和hashCode()的一致性。此外,要遵循以下原则: 1. 自反性:对于任何非null引用x,x.equals(x)应返回true。 2. ...