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,508 **** 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++) value[j] = s.charAt(i); count += len; return this; } /** --- 497,517 ---- throw new IndexOutOfBoundsException( "start " + start + ", end " + end + ", s.length() " + s.length()); int len = end - start; ensureCapacityInternal(count + len); ! 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,1131 **** --- 1129,1148 ---- + 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; } /**