首先我们写一段代码比较两个对象
public class Test {
public static void main(String[] args) {
String name2 = new String("tom"); //创建name1赋值tom
String name2 = new String("tom"); //创建name2赋值tom
System.out.println(name1==name2); //用“==”判断两个对象是否相同
System.out.println(name1.equals(name2));//用equals方法判断是否相同
}
}
我们都知道,“==”来判断两个引用类型的对象时,是直接判断对象的地址的,也就是说,不同的对象用“==”来判断,一定是不相同的,但equals就不一样了,这里的输出为
显然equals方法并不只是看地址,那么其到底是如何执行的呢
public boolean equals(Object anObject) {
if (this == anObject) { //“==”判断地址是否相同
return true;
}
if (anObject instanceof String) { //如果比较对象为String类型
String anotherString = (String)anObject;//因为anObject参数指向name2对象
//name2为String类型对象,所以可以下转型
int n = value.length;
//因为value是全局变量,实质是this.value.length
//name1 调用 equals,this即为name1,name1就是全局变量,this.value.length就是name1的字符有多少个
if (n == anotherString.value.length) {
//anotherString就是指向name2,anotherString.value.length代表name2有多少个字符。
//两个字符串相同,则长度一定相同,所以n == anotherString.value.length非常重要
char v1[] = value; //由name1字符组成的数组
char v2[] = anotherString.value;//由name2字符组成的数组
int i = 0;
while (n-- != 0) { //逐个字符比对
if (v1[i] != v2[i]) //只要有一个比对失败则两个字符串一定不相同
return false;
i++;
//这一段代码其实是创建了一个与比较对象一模一样的字符串,并且逐个字符与被比较对
//象进行对比,如果全部相同,则两个对象相同,否则不同
}
return true;
}
}
return false;
}
通过分析我们可以发现,equals方法中其实就使用了“==”首先判断地址,在地址不同的情况下不会立马认为两个对象不一样,而是在对象为字符串类型的情况下将它们的字符逐个比对,因此我们在判断几句语句是否相同时可以使用equals方法,避免“==”判断带来的误差。