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;
}
}
上述是 equals(); 方法的源代码;,让我们逐步分析一下是怎么工作的,我们先创建两个相同的对象并将地址分别赋值给 str1 和 str2 ;让后输出 str1.equals(str2)
public class Test {
public static void main(String[] args) {
String str1 = new String("Tom");
String str2 = new String("Tom");
System.out.println(str1.equals(str2));
}
}
true
- equals() 方法中的 this 是指上述代码 str1,anObject 是指 str2,先比较两者的地址是否相同,若相同则返回 true;(地址相同则内容一定相同,内容相同地址不一定相同,此处不过多解释),因为 str1 和 str2 地址不同,则继续执行程序;
- 判断 str2 指向的对象(一下简称 str2对象)是否是 String 类或者是其子类;是则将 str2对象 强制类型转换成 String 类,这里为是,继续执行;
- 用 length 方法将 str1对象(同str2对象)的长度赋值给 n, 这里 n=3;然后判断 n 的值是否与 str2对象 的长度相等,这里为相等,都是3;
- 将 str1对象 的内容即“Tom”赋值给数组 v1[] ;,将 str2对象 的内容,也为“Tom”赋值给数组 v2[] ;
- 创建循环,将 v1[] 数组和 v2[] 逐个元素比较,若相同则继续执行,若不同则返回 false;这里是相同,都为 ['T','o','m'];
- 如果执行到这一步,则str1对象 和 str2对象 的内容相同,返回 true。