为什么String.equals不检查char []值的相等性?

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.

Sot*_*lis 0

在 Java 7 中请参阅本文),substring()不再对返回的值使用相同的支持数组String。您仍然需要检查每个字符。基本上,String支持char[]永远不会共享,所以你不能

this.value == other.value
Run Code Online (Sandbox Code Playgroud)