首先看一段代码
package blog;
public class Equals {
public static void main(String[] args) {
String name1="Tom";
String name2="Tom";
System.out.println(name1==name2);
System.out.println(name1.equals(name2));
}
}
那么equals是怎么执行的呢?我们来看一下它的源代码,如下(ctrl+点击equals)
package blog;
public class Equals {
public static void main(String[] args) {
String name1="Tom";
String name2="Tom";//name1、name2中存的是地址,且地址相同(具体分析见“创建String对象”博客)
System.out.println(name1==name2);
System.out.println(name1.equals(name2));
//equals方法源代码
/*public boolean equals(Object anObject) {//首先name2传入equals方法,anObject指向name2对象,而name2又是String类型的,所以anObject又是一个上转型对象
if (this == anObject) {//因为name1调用了equals,所以this代表name1,因为Object是引用类型,所以==在这里比较的是地址。地址相同,所以是true
return true;//所以上面会输出true
}
if (anObject instanceof String) {//因为anObject参数指向name2对象,name2为String类型对象,所以anObject instanceof String 是true
String anotherString = (String)anObject;//下转型
int n = value.length;//value为常量,此处省略了this,实际为this.value.length,this又指代name1,所以是name1.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;
}*/
}
}