UFL*_*138 6 java string performance micro-optimization
我正在查看源代码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;
}
Run Code Online (Sandbox Code Playgroud)
我相信这可以提高性能,因为两个字符串是使用String.substring,甚至可能是实习的字符串获得的.
有人知道他们选择不以这种方式实施的原因吗?
更新: 对于可能不太了解String实现的任何人,除了String池之外还有两个String对象可以具有相同的char []值,int offset和int count.
请考虑以下代码:
String x = "I am a String, yo!";
String y = x.split(" ")[3];
String z = x.substring(7,14);
Run Code Online (Sandbox Code Playgroud)
你最终会遇到这样的情况:

显然,在Java 7u6中,Strings的价值共享功能已被废除,以满足一些基准测试.因此,如果您花时间使用String.substring()而不是String连接来使代码在适当的时间(或根本)运行,那么您就是SOL.
在 Java 7 中(请参阅本文),substring()不再对返回的值使用相同的支持数组String。您仍然需要检查每个字符。基本上,String支持char[]永远不会共享,所以你不能
this.value == other.value
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1038 次 |
| 最近记录: |