我正在查看源代码java.lang.String
并注意到该equals
方法不会检查char[]
每个 String 的支持是否是同一个对象。这不会改善比较时间吗?
此重写版本中包含的假设改进:
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 实现的任何人,除了 String 池之外,还有两个 String 对象可以具有相同的 char[] 值、int 偏移量和 int 计数的情况。
考虑以下代码:
String x = "I am a String, yo!";
String y = x.split(" ")[3];
String z = x.substring(7,14);
你最终会遇到这样的情况:
显然,字符串的值共享功能在 Java 7u6 中已被取消,以满足某些基准。因此,如果您花时间通过使用 String.substring() 而不是字符串连接来让代码在适当的时间(或根本)运行,那么您就是 SOL。