Java中equals()与==的全面解析,助你告别困惑!
2023-09-03 19:36:21
在Java编程中,判断两个对象是否相等常常使用equals()
或==
,但是其中的区别和原理可能很多人并不完全清楚。今天就借着上面的问题来看看equals()
和==
的区别和原理。
基本类型与==
的含义
基本类型:编程语言中内置的最小粒度的数据类型。它包括四大类八种类型:
- 整数类型:
byte
、short
、int
、long
- 浮点数类型:
float
、double
- 字符类型:
char
- 布尔类型:
boolean
当两个基本类型变量进行==
比较时,比较的是它们的值是否相等。比如:
int a = 10;
int b = 10;
System.out.println(a == b); // 输出:true
引用类型与==
的含义
引用类型:也称对象类型,是用户自定义的数据类型,由若干个成员变量组成。对象变量存储的是对象在内存中的地址,而==
比较的是两个对象变量存储的地址是否相等。比如:
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // 输出:true
在上面的代码中,str1
和str2
指向的是同一个对象,因此==
比较结果为true
。
equals()
方法与==
的区别
equals()
方法是Object
类的成员方法,用于比较两个对象的内容是否相等。当两个对象的内容相等时,equals()
方法返回true
,否则返回false
。
==
用于比较两个对象是否指向同一个对象,而equals()
用于比较两个对象的内容是否相等。因此,==
和equals()
是两个不同的概念。
什么时候使用==
,什么时候使用equals()
?
一般情况下,对于基本类型变量,可以使用==
进行比较。对于引用类型变量,可以使用equals()
方法进行比较。
但是,对于某些特定的引用类型变量,也需要使用==
进行比较。比如:
- 当两个字符串变量的值相等时,可以使用
==
进行比较。 - 当两个包装类变量的值相等时,可以使用
==
进行比较。 - 当两个日期对象的值相等时,可以使用
==
进行比较。
重写equals()
方法
当需要比较两个自定义对象的相等性时,需要重写equals()
方法。重写equals()
方法时,需要遵循以下原则:
- 自反性:对于任何非空引用值
x
,x.equals(x)
必须返回true
。 - 对称性:对于任何非空引用值
x
和y
,如果x.equals(y)
返回true
,那么y.equals(x)
也必须返回true
。 - 传递性:对于任何非空引用值
x
、y
和z
,如果x.equals(y)
返回true
,并且y.equals(z)
返回true
,那么x.equals(z)
也必须返回true
。 - 一致性:对于任何非空引用值
x
和y
,多次调用x.equals(y)
必须始终返回相同的结果。 - 对于任何非空引用值
x
,x.equals(null)
必须返回false
。
覆盖equals()
方法
当需要比较两个自定义对象的相等性时,需要覆盖equals()
方法。覆盖equals()
方法时,需要遵循以下原则:
- 对于任何非空引用值
x
,x.equals(x)
必须返回true
。 - 对于任何非空引用值
x
和y
,如果x.equals(y)
返回true
,那么y.equals(x)
也必须返回true
。 - 对于任何非空引用值
x
、y
和z
,如果x.equals(y)
返回true
,并且y.equals(z)
返回true
,那么x.equals(z)
也必须返回true
。 - 对于任何非空引用值
x
和y
,多次调用x.equals(y)
必须始终返回相同的结果。 - 对于任何非空引用值
x
,x.equals(null)
必须返回false
。 - 如果两个对象的内容相等,那么它们的哈希码也必须相等。
总结
equals()
方法是Object
类的成员方法,用于比较两个对象的内容是否相等。当两个对象的内容相等时,equals()
方法返回true
,否则返回false
。
==
用于比较两个对象是否指向同一个对象,而equals()
用于比较两个对象的内容是否相等。因此,==
和equals()
是两个不同的概念。
一般情况下,对于基本类型变量,可以使用==
进行比较。对于引用类型变量,可以使用equals()
方法进行比较。
但是,对于某些特定的引用类型变量,也需要使用==
进行比较。比如:
- 当两个字符串变量的值相等时,可以使用
==
进行比较。 - 当两个包装类变量的值相等时,可以使用
==
进行比较。 - 当两个日期对象的值相等时,可以使用
==
进行比较。
当需要比较两个自定义对象的相等性时,需要重写equals()
方法。重写equals()
方法时,需要遵循以下原则:
- 自反性:对于任何非空引用值
x
,x.equals(x)
必须返回true
。 - 对称性:对于任何非空引用值
x
和y
,如果x.equals(y)
返回true
,那么y.equals(x)
也必须返回true
。 - 传递性:对于任何非空引用值
x
、y
和z
,如果x.equals(y)
返回true
,并且y.equals(z)
返回true
,那么x.equals(z)
也必须返回true
。 - 一致性:对于任何非空引用值
x
和y
,多次调用x.equals(y)
必须始终返回相同的结果。 - 对于任何非空引用值
x
,x.equals(null)
必须返回false
。
当需要覆盖两个自定义对象的相等性时,需要覆盖equals()
方法。覆盖equals()
方法时,需要遵循以下原则:
- 对于任何非空引用值
x
,x.equals(x)
必须返回true
。 - 对于任何非空引用值
x
和y
,如果x.equals(y)
返回true
,那么y.equals(x)
也必须返回true
。 - 对于任何非空引用值
x
、y
和z
,如果x.equals(y)
返回true
,并且y.equals(z)
返回true
,那么x.equals(z)
也必须返回true
。 - 对于任何非空引用值
x
和y
,多次调用x.equals(y)
必须始终返回相同的结果。 - 对于任何非空引用值
x
,x.equals(null)
必须返回false
。 - 如果两个对象的内容相等,那么它们的哈希码也必须相等。