Java之==和equals的区别以及equals和hashcode的关系

} else {System.out.println("str1 和 str2 引用不同对象");我们重写了equals方法来比较两个Person对象的内容是否相等。

在Java中,==和equals是两个常见的比较运算符,但它们之间存在着很大的区别。如果不理解这些差异,可能会导致代码出现难以预料的行为。本文将深入探讨==和equals之间的区别,并介绍equals方法与hashcode方法之间的联系。

==与equals

首先来看一下”==”运算符。它被用于比较两个对象是否引用同一个实例。例如:

“`java

String str1 = “hello”;

String str2 = “hello”;

if (str1 == str2) {

System.out.println(“str1 和 str2 引用同一个对象”);

} else {

System.out.println(“str1 和 str2 引用不同对象”);

}

“`

上面这段代码会输出”str1 和 str2 引用同一个对象”。

而对于equals方法,则是比较两个对象是否相等,即内容是否相同。例如:

String str3 = new String(“hello”);

if (str1.equals(str3)) {

System.out.println(“str1 和 str3 内容相等”);

System.out.println(“str1 和 str3 内容不相等”);

上面这段代码会输出”str1 和 str3 内容相等”。

那么为什么要使用equals方法呢?因为有时候我们需要判断两个实例的内容是否相同,而不是判断它们是否引用同一个实例。例如:

public class Person {

private String name;

private int age;

Java之==和equals的区别以及equals和hashcode的关系

// 省略getter和setter方法

@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

Person person = (Person) o;

return age == person.age && Objects.equals(name, person.name);

}

上面这段代码中,我们重写了equals方法来比较两个Person对象的内容是否相等。如果不重写equals方法,则默认会使用Object类中的equals方法,这个方法是比较两个对象是否引用同一个实例。

equals与hashcode

在Java中,如果我们要将对象存储到HashSet或HashMap等集合类中,就需要同时重写equals和hashcode方法。为什么呢?因为HashSet和HashMap内部使用散列表(Hash表)来存储元素,当插入新元素时会先计算出该元素在散列表中的位置(即哈希值),然后再根据该位置进行操作。

那么问题来了:如何计算出哈希值呢?答案就是调用对象的hashcode方法。而对于HashSet和HashMap来说,在判断两个对象是否相等时也会调用它们的equals方法。

因此,在重写equals方法时一定要同时重写hashcode方法,并保证以下规则:

– 如果两个对象相等,则它们的哈希值必须相等。

– 如果两个对象的哈希值相等,则它们不一定相等。

例如:

public int hashCode() {

return Objects.hash(name, age);

上面这段代码中,我们重写了equals方法和hashcode方法。在使用HashSet或HashMap时,就可以正确地比较和存储Person对象了。

– “==”比较两个对象是否引用同一个实例。

– equals比较两个对象的内容是否相同。

– 在重写equals方法时一定要同时重写hashcode方法,并保证以上规则。