21xrx.com
2025-03-29 03:49:57 Saturday
文章检索 我的文章 写文章
深入理解equals和hashCode方法
2023-06-11 20:43:12 深夜i     16     0
Java面试 equals方法 hashCode方法

Java面试经典

Java中的equals和hashCode是用于判断两个对象是否相等的核心方法,也是面试中必问的经典题目。但是,对于这两个方法的理解却不是非常透彻,一些看似简单的问题也可能会让面试者直接倒在这道题上。因此,今天我们就来一起深入探讨一下这两个方法的本质。

首先,让我们来看一段代码:

public class Student {
  private String name;
  private int id;
  public Student(String name, int id)
    this.name = name;
    this.id = id;
  
  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    
    if (obj == null || getClass() != obj.getClass())
      return false;
    
    Student student = (Student) obj;
    return id == student.id && name.equals(student.name);
  }
  @Override
  public int hashCode() {
    return Objects.hash(name, id);
  }
}
public class Main {
  public static void main(String[] args) {
    Student s1 = new Student("Tom", 1);
    Student s2 = new Student("Tom", 1);
    System.out.println(s1.equals(s2));
    System.out.println(s1.hashCode() == s2.hashCode());
  }
}

我们创建了两个Student对象,它们具有相同的name和id属性。然后我们运行这个程序,会发现输出的结果都是true。这是因为我们在Student中重写了equals和hashCode方法,让它们只比较了name和id属性,而不是整个对象。我们可以看到,当s1和s2的所有属性都相同时,它们的hashCode方法返回的值也相同,从而使equals方法返回true。

但是,如果我们稍微改一下代码:

public static void main(String[] args) {
  Set
  set = new HashSet<>();
 
  Student s1 = new Student("Tom", 1);
  Student s2 = new Student("Tom", 1);
  set.add(s1);
  set.add(s2);
  System.out.println(set.size());
}

我们将s1和s2都添加到了一个HashSet中,并输出了set的大小。你猜会输出什么?

很多人可能会认为会输出1,因为s1和s2是相等的,因此只会添加一个元素。但是,实际上输出的结果是2!为什么会这样呢?

这是因为当我们将s1和s2添加到HashSet中时,它们的hashCode方法返回的值是不同的。这是因为我们使用了Objects.hash(name, id)来计算hashCode,这个方法会将name和id的值计算出一个哈希值。但是,不同的对象可能会具有相同的name和id属性,因此它们的hashCode值并不一定相同。因此,在我们的例子中,虽然s1和s2是相等的,但是它们的hashCode方法返回的值不同,HashSet就认为它们是两个不同的元素。

为了解决这个问题,只需要让Student类的hashCode方法总是返回相同的值即可。一种简单的方法是将hashCode方法修改为:

@Override
public int hashCode() {
  return Objects.hash(1);
}

这里我们只是返回了一个固定的值1,这样就可以保证所有的Student对象都具有相同的hashCode。这样就可以保证在将s1和s2添加到HashSet中时,它们的hashCode方法返回的值相同,HashSet就认为它们只是一个元素。

通过这个例子,我们可以看出,要正确地理解equals和hashCode方法并不是一件容易的事情。但是,只要我们深入了解它们的本质,就可以在面试中从容应对。当然,在实际的开发中,我们也需要经常使用equals和hashCode方法,因此熟练掌握它们的使用也是非常重要的。

  
  

评论区

    相似文章