src/share/classes/java/lang/AbstractStringBuilder.java

Print this page
rev 6546 : 7197183: Alternate implementation of String.subSequence which uses shared backing array.
Reviewed-by: duke

@@ -497,12 +497,21 @@
             throw new IndexOutOfBoundsException(
                 "start " + start + ", end " + end + ", s.length() "
                 + s.length());
         int len = end - start;
         ensureCapacityInternal(count + len);
-        for (int i = start, j = count; i < end; i++, j++)
+        if (s instanceof String) {
+            System.arraycopy(((String)s).value, start, value, count, len);
+        } else if ((s instanceof StringBuilder) || (s instanceof StringBuffer)) {
+            // two instanceof on leaf class is faster than instanceof check on AbstractStringBuilder.
+            System.arraycopy(((AbstractStringBuilder)s).value, start, value, count, len);
+        } else {
+            // unspecialized path
+            for (int i = start, j = count; i < end; i++, j++) {
             value[j] = s.charAt(i);
+            }
+        }
         count += len;
         return this;
     }
 
     /**

@@ -1120,12 +1129,20 @@
                 + s.length());
         int len = end - start;
         ensureCapacityInternal(count + len);
         System.arraycopy(value, dstOffset, value, dstOffset + len,
                          count - dstOffset);
+        if (s instanceof String) {
+            System.arraycopy(((String)s).value, start, value, dstOffset, len);
+        } else if ((s instanceof StringBuilder) || (s instanceof StringBuffer)) {
+            // two instanceof on leaf class is faster than instanceof check on AbstractStringBuilder.
+            System.arraycopy(((AbstractStringBuilder)s).value, start, value, dstOffset, len);
+        } else {
+            // unspecialized path
         for (int i=start; i<end; i++)
             value[dstOffset++] = s.charAt(i);
+        }
         count += len;
         return this;
     }
 
     /**