先举一个调用equals方法的例子:
public class Test{
public static void main(String[] args) {
String name1="Tom";
String name2="Tom";
System.out.println(name1==name2);
System.out.println(name1.equals(name2));
}
}
/*运行结果
true
true*/
//分析
public boolean equals(Object anObject) {//name2传入equals方法,存入anObject中,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;
}
- 当值相同但地址不同时:
public class Test{
public static void main(String[] args) {
String name1="Tom";
String name2=new String("Tom");
System.out.println(name1==name2);
System.out.println(name1.equals(name2));
}
}
/*运行结果
false
true*/
//分析
public boolean equals(Object anObject) {//name2传入equals方法,存入anObject中,name2为上转型对象
if (this == anObject) {//因为name1与name2采用的方式不同,所以地址不同,所以不执行
return true;
}
if (anObject instanceof String) {//name2为String类的对象,true
String anotherString = (String)anObject;//name2为上转型对象,此时进行下转型
int n = value.length;//将调用此方法的对象的字符串长度(this.value.length)赋值给n
if (n == anotherString.value.length) {//判断,调用此方法的对象的字符串长度与name2的字符串长度是否相等
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;
}
- 当比对对象不为String类型时:
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));
}
}
/*运行结果
false
false*/
//分析
public boolean equals(Object anObject) {//test传入equals方法,存入anObject中,test为上转型对象
if (this == anObject) {//因为name1与test为不同类型不同对象,所以地址显然不同
return true;
}
if (anObject instanceof String) {//test也不为String类创建的对象,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;//直接返回false
}