我正在查看java.lang.String
的源代码,并注意到equals
方法没有检查每个字符串后面的char[]
是否是同一个对象。这样做不会提高比较时间吗?
以下是改写版本中包含的改进:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
/** Begin Optimization **/
if(v1==v2 && i==j){
return true;
}
/** End Optimization **/
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
我相信这样做会提高性能,特别是在使用
String.substring
和可能的国际化字符串的情况下。
有人知道他们为什么选择不用这种方式实现吗?
更新:对于那些可能不太了解String的实现的人来说,除了字符串池之外,还有其他情况下两个字符串对象可以具有相同的char[]值、int偏移量和int计数。
考虑以下代码:
String x = "I am a String, yo!";
String y = x.split(" ")[3];
String z = x.substring(7,14);
你最终会面临这样的情况:
![Debugger Expressions](https://istack.dev59.com/Tc4c0.webp)
clone()
数组。 - nachokkfoo.substring(i, j).equals(foo.substring(i, j))
,但这也会增加一个额外的检查,用于处理更常见的情况,即字符串数组不相等的情况,这很可能比节省的时间花费更多平均时间。请参见例如这篇博客文章。 - Louis Wasserman