Java程序中测试两个变量是否相等有两种方式:一种是利用==运算符,另一种是利用equals()方法。
一、==运算符
当使用==来判断变量是否相等时,如果两个变量时基本类型变量,且都是数值类型(不一定要求数据类型严格相同),只要两变量的值相等,就返回true;对于两个引用类型的变量,只有这两个变量指向同一个对象时,才返回true。不可用于比较类型上没有父子关系的两个对象。
下面程序示范了使用来判断两种类型变量是否相等的结果。
public class EqualTest
{
public static void main(String[] args)
{
int it = 65;
float fl = 65.0f;
//将输出true
System.our.println("65和65.0f是否相等?" + (it == fl));
char ch = 'A';
// 将输出true
System.out.println("65和'A'是否相等?" + (it == ch));
String str1 = new String("hello");
String str2 = new String("hello");
// 将输出false
System.out.println("str1和str2是否相等?" + (str1 == str2));
}
}
在很多时候,程序判断两个引用变量是否相等时,也希望有一种类似于“值相等”的判断规则,并不严格要求两个引用变量指向同一个对象。
二、equals()方法
equals()方法时Object类提供的一个实例方法,因此所有引用变量都可调用该方法来判断是否与其他变量相等。但使用这个方法判断两个对象相等的标准与使用==运算符没有区别,同样要求两个引用变量指向同一个对象才会返回true。因此这个Object类提供的equals()方法没有太大的实际意义,如果希望采用自定义的相等标准,则可采用重写equals方法来实现。
String已经重写了Object的equals()方法,String的equals()方法判断两个字符串相等的标准是:只要两个字符串所包含的字符序列相同,通过equals()比较将返回true,否则将返回false。
通常而言,正确地重写equals()方法应该满足下列条件。
- 自反性:对任意x,x.equals(x);一定返回true;
- 对称性:对任意x和y,如果y.equals(x)返回true,则x.equals(y)也返回true;
- 传递性:对任意x、y、z,如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)一定返回true;
- 一致性:对任意x和y,如果对象中用于等价比较的信息没有改变,那么无论调用x.equals(y)多少次,返回的结果应该保持一致,要么一致是true,要么一致是false。
- 对任何不是null的x,x.equals(null)一定返回false。
在实际应用中常常需要重写equals()方法,重写equals方法时,相等条件是由业务要求决定的,因此equals()方法的实现也是由业务要求决定的。
下面提供一个重写equals()方法的模板
class Person
{
private String name;
private String idStr;
// 此处省略name和idStr的setter和getter方法
// 重写equals()方法,提供自定义的相等标准
public boolean equals(Object obj)
{
// 如果两个对象为同一个对象——自反性
if(this == obj)
return true;
// 只有当obj是Person对象
if(obj != null && obj.getClass() == Person.class)
{
Person personObj = (Person)obj;
// 并且当前对象的idStr与obj对象的idStr相等时才可判断两个对象相等
if(this.getIdStr().equals(personObj.getIdStr()))
{
return true;
}
}
return false;
}
}