21xrx.com
2024-11-08 21:58:41 Friday
登录
文章检索 我的文章 写文章
深入理解equals和hashCode方法
2023-06-11 20:43:12 深夜i     --     --
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方法,因此熟练掌握它们的使用也是非常重要的。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复