返回

Java中equals()与==的全面解析,助你告别困惑!

见解分享

在Java编程中,判断两个对象是否相等常常使用equals()==,但是其中的区别和原理可能很多人并不完全清楚。今天就借着上面的问题来看看equals()==的区别和原理。

基本类型与==的含义

基本类型:编程语言中内置的最小粒度的数据类型。它包括四大类八种类型:

  • 整数类型:byteshortintlong
  • 浮点数类型:floatdouble
  • 字符类型: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

在上面的代码中,str1str2指向的是同一个对象,因此==比较结果为true

equals()方法与==的区别

equals()方法是Object类的成员方法,用于比较两个对象的内容是否相等。当两个对象的内容相等时,equals()方法返回true,否则返回false

==用于比较两个对象是否指向同一个对象,而equals()用于比较两个对象的内容是否相等。因此,==equals()是两个不同的概念。

什么时候使用==,什么时候使用equals()

一般情况下,对于基本类型变量,可以使用==进行比较。对于引用类型变量,可以使用equals()方法进行比较。

但是,对于某些特定的引用类型变量,也需要使用==进行比较。比如:

  • 当两个字符串变量的值相等时,可以使用==进行比较。
  • 当两个包装类变量的值相等时,可以使用==进行比较。
  • 当两个日期对象的值相等时,可以使用==进行比较。

重写equals()方法

当需要比较两个自定义对象的相等性时,需要重写equals()方法。重写equals()方法时,需要遵循以下原则:

  • 自反性:对于任何非空引用值xx.equals(x)必须返回true
  • 对称性:对于任何非空引用值xy,如果x.equals(y)返回true,那么y.equals(x)也必须返回true
  • 传递性:对于任何非空引用值xyz,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也必须返回true
  • 一致性:对于任何非空引用值xy,多次调用x.equals(y)必须始终返回相同的结果。
  • 对于任何非空引用值xx.equals(null)必须返回false

覆盖equals()方法

当需要比较两个自定义对象的相等性时,需要覆盖equals()方法。覆盖equals()方法时,需要遵循以下原则:

  • 对于任何非空引用值xx.equals(x)必须返回true
  • 对于任何非空引用值xy,如果x.equals(y)返回true,那么y.equals(x)也必须返回true
  • 对于任何非空引用值xyz,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也必须返回true
  • 对于任何非空引用值xy,多次调用x.equals(y)必须始终返回相同的结果。
  • 对于任何非空引用值xx.equals(null)必须返回false
  • 如果两个对象的内容相等,那么它们的哈希码也必须相等。

总结

equals()方法是Object类的成员方法,用于比较两个对象的内容是否相等。当两个对象的内容相等时,equals()方法返回true,否则返回false

==用于比较两个对象是否指向同一个对象,而equals()用于比较两个对象的内容是否相等。因此,==equals()是两个不同的概念。

一般情况下,对于基本类型变量,可以使用==进行比较。对于引用类型变量,可以使用equals()方法进行比较。

但是,对于某些特定的引用类型变量,也需要使用==进行比较。比如:

  • 当两个字符串变量的值相等时,可以使用==进行比较。
  • 当两个包装类变量的值相等时,可以使用==进行比较。
  • 当两个日期对象的值相等时,可以使用==进行比较。

当需要比较两个自定义对象的相等性时,需要重写equals()方法。重写equals()方法时,需要遵循以下原则:

  • 自反性:对于任何非空引用值xx.equals(x)必须返回true
  • 对称性:对于任何非空引用值xy,如果x.equals(y)返回true,那么y.equals(x)也必须返回true
  • 传递性:对于任何非空引用值xyz,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也必须返回true
  • 一致性:对于任何非空引用值xy,多次调用x.equals(y)必须始终返回相同的结果。
  • 对于任何非空引用值xx.equals(null)必须返回false

当需要覆盖两个自定义对象的相等性时,需要覆盖equals()方法。覆盖equals()方法时,需要遵循以下原则:

  • 对于任何非空引用值xx.equals(x)必须返回true
  • 对于任何非空引用值xy,如果x.equals(y)返回true,那么y.equals(x)也必须返回true
  • 对于任何非空引用值xyz,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也必须返回true
  • 对于任何非空引用值xy,多次调用x.equals(y)必须始终返回相同的结果。
  • 对于任何非空引用值xx.equals(null)必须返回false
  • 如果两个对象的内容相等,那么它们的哈希码也必须相等。