关于 equals

JDK1.8后字符串常量池被移动到堆(Heap)中,显式的String常量放在堆里的常量池,而String对象放在普通的堆中。

复习:栈放的是引用,实际的数据都是保存在堆中。

String a = "abc";
String b = "abc";
String c = new String("abc");
String d = new String("abc");
System.out.println(a == b);
System.out.println(a == c);
System.out.println(c == d);

从结果“true false false”反推概念,对象a,b使用显示声明,“abc”是在常量池中的同一个内存,而c,d使用new声明,相当于两个不同的普通对象,分别保存在堆中。

然后“‘==’比较的是地址,‘equals’比较的是值”这句话对String是成立的,但对其他对象并不完全成立。

equals是超类Object的一个方法,实际上也是间接使用“==”比较:

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

其中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;
}
原文地址:https://www.cnblogs.com/LinsenLi/p/12418471.html