Java hashCode()方法示例
Java中的超级类 **java.lang.Object]提供了两个比较对象的重要方法: equals()和 hashcode()。当遇到类间交互时,这些方法被广泛使用。我们将在本教程中查看hashCode()。
方法定义与实现
hashCode():默认返回一个随机整数,每次都是唯一的。如果我们执行应用程序两次,例如第二次,则值将不同。hashCode值主要用于哈希格式的集合,如HashSet、HashMap等。请注意,此方法 必须在重写equals()方法的每个类中重写
hashCode()可以使用的集合列表
- HashSet
- TreeSet
- LinkedHashSet
- CopyOnWriteArraySet
什么时候应该使用hashCode()方法
如果我们想执行equals()方法,我们需要确保这些对象具有相同的 唯一hashcode ID,当hashcode ID不同时,我们永远不应该执行equals()。
注意:当hashCode()比较返回 false时,equals()方法也必须返回 false。如果哈希码是 不同,则对象是 不相等。
hashCode()和equals()的实例
import java.lang.*; public class hashCodeExample { public static void main(String[] args){ Car BMW = new Car(1, "BMW"); //1 --> ID, 2 --> the name of the car brand Car mercedes = new Car(2, "Mercedes"); //1 --> ID, 2 --> the name of the car brand boolean isHashcodeEqual = BMW.hashCode() == mercedes.hashCode(); if (isHashcodeEqual) { System.out.println("Equal"); } else { System.out.println("No need to compare with equals() method as it is clear " + "that the id of these objects is not equal."); } } static class Car { int id; String brand; public Car (int id, String brand) { this.id = id; this.brand = brand; } @Override public boolean equals(Object obj) { if(this == obj) { return true; } else if(obj == null || getClass() != obj.getClass()) { return false; } Car car = (Car) obj; return id == car.id && brand.equals(car.brand); } @Override public int hashCode() { return id; } } }
上面代码的简要分解
前几行,我们创建两个“Car”对象并传递一个id和一个品牌名。
Car BMW = new Car(1, "BMW"); //1 --> ID, 2 --> the name of the car brand Car mercedes = new Car(2, "Mercedes"); //1 --> ID, 2 --> the name of the car brand
然后我们在一个名为isHashCodeEqual的变量中存储一个布尔值,该变量根据两个对象的id是否相等而获得true或者false。
boolean isHashcodeEqual = BMW.hashCode() == mercedes.hashCode();
在那之后,我们有一个条件来检查ishashcode是否等于true或者false。如果为true,则表示这两个对象的id相等。如果不是,那就意味着不是。如果它们相等,我们只需打印“相等”。如果不是,我们将打印一条有用的消息,基本上说,如果它们不相等,就不需要使用equals进行检查,因为这两个对象不共享相同的id。
if (isHashcodeEqual) { System.out.println("Equal"); } else { System.out.println("No need to compare with equals() method as it is clear " + "that the id of these objects is not equal."); }
下面是我们的静态类“汽车”。
static class Car { int id; String brand; public Car (int id, String brand) { this.id = id; this.brand = brand; } @Override public boolean equals(Object obj) { if(this == obj) { return true; } else if(obj == null || getClass() != obj.getClass()) { return false; } Car audi = (Car) obj; return id == audi.id && brand.equals(audi.brand); } @Override public int hashCode() { return id; } }
hashCode()的常见错误
在hashCode()方法中返回常量值,而不是为每个对象返回唯一值。
在处理HashMap之类的哈希集合时不重写equals()和hashCode()。
忘记了用equals()方法重写hashCode()或者其他方法。
hashCode()需要记住的关键事项
使用有效的算法,以便生成唯一的哈希代码
重写equals()方法时,请始终确保也重写了hashCode()方法。
当比较两个对象的哈希代码的结果为false时,equals()方法也应为false。(参见上面的代码示例)
如果在使用哈希集合时equals()和hashCode()未被重写,则集合将具有重复项。