Java之==和equals的区别以及equals和hashcode的关系
} else {System.out.println("str1 和 str2 引用不同对象");我们重写了equals方法来比较两个Person对象的内容是否相等。
- 本文目录导读:
- 1、==与equals
- 2、equals与hashcode
在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;
// 省略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方法,并保证以上规则。