关于equals

关于JAVA的面试,底层实现这部分是一个巨大的坑。

一个小问题

最后两个输出分别是什么

Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1 == o2);
System.out.println(o1.equals(o2));

答案是 false,false
第一个是false肯定没什么疑问,因为两个引用o1,o2分别指向两个不同的对象,这两个对象的地址肯定是不同的,而 "==" 就是比较两个对象的地址是否相同。
第二个false就需要查看Object的equals方法的源码了

public boolean equals(Object obj) {
    return (this == obj);
}

从源码可以很明显看出,Object的equals方法跟 "==" 是没有任何区别的。

那么对于比较常用的String呢

可以看看它重写的equals方法

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String) anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                        return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

非常明显,String的equals从两方面来判断两个String对象是否相等
1.引用地址是否相同
2.若引用地址不同,那么判断字符串长度,长度相同再判断字符串中每一个字符是否都相同(通俗一点说就是对应字符串的内容是否一样)。

你可能感兴趣的:(关于equals)