1.思考:equals代码怎么执行的?
package equals;
public class Test {
public static void main(String[] args) {
String name1="Tom";
String name2="Tom";
System.out.println(name1==name2); //true
System.out.println(name1.equals(name2));
}
}
2.equals底层代码
public boolean equals(Object anObject) { //name2传入equals方法,anObject指向name2对象,name2为上转型对象
if (this == anObject) { //因为name1与name2都是采用直接赋值的方式创建的String类型的对象,所以是true
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;
}
2.思考:equals代码怎么执行的?
package equals;
public class Test {
public static void main(String[] args) {
String name1="Tom";
String name2=new String("Tom");
System.out.println(name1==name2);//false
System.out.println(name1.equals(name2));
}
}
分析equals底层代码:
public boolean equals(Object anObject) { //name2为上转型对象
if (this == anObject) { //因为name1与name2地址不同,所以走接下来的代码
return true;
}
if (anObject instanceof String) { //因为anObject参数指向name2对象,name2为String类型对象,所以anObject instanceof String 是 true 实例 intanceof 类
String anotherString = (String)anObject; //因为anObject参数指向name2对象,name2为String类型对象,所以可以下转型
int n = value.length; //因为value是全局变量,实质是this.value.length,name1 调用 equals,this即为name1,name1就是全局变量,this.value.length就是name1的字符有多少个
if (n == anotherString.value.length) { //anotherString就是指向name2,anotherString.value.length代表name2有多少个字符。两个字符串相同,则长度一定相同,所以n == anotherString.value.length非常重要
char v1[] = value;//由name1字符组成的数组
char v2[] = anotherString.value;//由name2字符组成的数组
int i = 0;
while (n-- != 0) { //逐个字符比对
if (v1[i] != v2[i]) //只要有一个比对失败则两个字符串一定不相同
return false;
i++;
}
return true;
}
}
return false;
}
3.思考:equals代码怎么执行的?
package equals;
public class Test {
public static void main(String[] args) {
String name1="Tom";
Test test= new Test();
System.out.println(name1==test);//因为javac在编译时已经知道连个类型不相同,所以编译出错
System.out.println(name1.equals(test));
}
}
分析equals底层代码
public boolean equals(Object anObject) { //test传入equals方法,anObject指向test对象,test为上转型对象
if (this == anObject) { //因为name1与test地址不同, 所以走下面的代码
return true;
}
if (anObject instanceof String) { //因为anObject参数指向test对象,test为Test类型对象,不是String类,所以anObject instanceof String 直接走到最后 return false;
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;
}