Java hashCode()方法示例

时间:2020-02-23 14:37:09  来源:igfitidea点击:

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()未被重写,则集合将具有重复项。