首先来分析这串代码
public class Equals1 {
public static void main(String[] args) {
String str1 = new String("hello"); //new 一个对象的时候创建了新的地址值
String str2 = new String("hello");
String str3 = "hello";
String str4 = "hello";
System.out.println(str1 == str2); //false
System.out.println(str3 == str4); //true
System.out.println(str1.equals(str2));//true
}
运行结果 false true false
为什么会产生这种结果呢?
因为字符串是引用数据类型,用==号比较的是其中的地址值,String类在new一个空间的时候,就会在堆内存新创一个空间,str1 和 str2 指向的不是同一个地址值, = =比较的就是所在内存中的地址值是否相等,所以第一个false第二个true就很容易理解了。
对于String类中的equals,其比较的是指向的字符串对象所存储的字符串是否相等。
但是在Object类中,equals的方法如下:
public boolean equals(Object obj) {
return (this == obj);
}
很明显,在Object类中,equals比较的是两个对象的引用是否相等,即是否指向同一个对象,但是str1和str2明显不是指向同一个对象,为什么会正确呢?
这是因为在String类中,把equals方法重写了,下面是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;
}