关于 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;
}

 

posted on 2020-03-05 09:31  植物大戰僵尸  阅读(154)  评论(1编辑  收藏  举报

导航