本文基于JDK1.8
1 String中equals源码分析
String是final类型,它不可被继承。String的equals方法如下所示:
/**
* Compares this string to the specified object. The result is {@code
* true} if and only if the argument is not {@code null} and is a {@code
* String} object that represents the same sequence of characters as this
* object.
*将这个字符串与指定对象进行比较,当且仅当参数不为空且参数是字符串,并与当前具有相同字符串序列时返回true
* @param anObject
* The object to compare this {@code String} against
*
* @return {@code true} if the given object represents a {@code String}
* equivalent to this string, {@code false} otherwise
*
* @see #compareTo(String)
* @see #equalsIgnoreCase(String)
*/
public boolean equals(Object anObject) {
if (this == anObject) {//#1
return true;//#2
}
if (anObject instanceof String) {//#3
String anotherString = (String)anObject;//#4
int n = value.length;//#5
if (n == anotherString.value.length) {//#6
char v1[] = value;//#7
char v2[] = anotherString.value;//#8
int i = 0;//#9
while (n-- != 0) {//#10
if (v1[i] != v2[i])//#11
return false;//#12
i++;//#13
}
return true;//#14
}
}
return false;//#15
}
英文解释看得不太明白,那就从代码方面看。其中涉及到 == 判断,如果不清楚的可以查看【Java】Java中的==
- 第#1行,因为this指向的是当前String类,所以这里判断的是传入的Object对象与当前String对象的地址是否相等,即是否指向同一个String对象,如果是,则返回true(第#2行)。
- 第#3行判断指定的类型是否是String类型,如果是,则进行第#4操作;如果不是,则执行#15操作。
- 第#4行,因为传入的对象是String类型,所以将anObject强制转换为String类型,并赋值给anotherString
- 第#5行,计算字符串长度。value指的是存储String值的一个字符数组,其源码如下所示
/** The value is used for character storage. */
private final char value[];
这里的value数组是final类型的,说明String类型的对象一旦赋值,则不能更改;如果更改,则会重新创建一个String对象。
- 第#6行,如果anotherString的长度与当前字符串长度相等,则进行#7
- 第#7行,创建一个v1字符数组,将当前字符串的字符数组赋值给v1
- 第#8行,创建一个v2字符数组,将anotherString的字符数组赋值给v2
- 第#9行,设置一个遍历角标i,并设置i=0
- 第#10行,使用while循环,这里很有意思,循环控制条件是当前字符串长度每次减一,直到0为止。
- 第#11行,判断同角标处的字符是否相等,如果不相等,返回false(第#12行);如果相等,进行第#13行,继续循环
- 第#13行,i计数加1
- 第#14行,返回true,表示当前字符串中的字符与传入的参数字符全部相等。
- 第#15行,执行这一行时,表示传入的参数(1)与当前String对象的地址不相等;(2)不是String类型。
2 equals使用
// 例一
String str = "wo";
String str1 = "wo";
System.out.println("例一:" + str.equals(str1));
// 例二
String str2 = new String("wo");
String str3 = new String("wo");
System.out.println("例二:" + str2.equals(str3));
结果
例一:true
例二:true
例一比较的是地址,因为str和str1指向的对象的地址是相等的,所以返回true;例二比较的是值,因为str2和str3指向对象的地址不相等,所以接着比较两个字符串对象的值,因为值是相等的,所以返回的是true。
3 总结
String中equals方法比较的是
- 如果当前String对象与要比较的对象地址相等,则返回true
- 如果当前String对象与要比较的对象地址不相等,那么判断要比较的对象是不是字符串类型,如果是字符串类型,则比较两个字符串中每个字符是否对应相等,如果对应相等则返回true。
- 如果不对应相等,则返回false;如果两个对象地址不相等,且要比较的对象不是String类型,则返回false。
网友评论