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;
}
/**