java中的equals方法

首先我们写一段代码比较两个对象

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就不一样了,这里的输出为

java中的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方法,避免“==”判断带来的误差。

上一篇:浅析Java底层代码——String类equals方法——示例3


下一篇:详述equals底层代码