abstract class AbstractStringBuilder { char value[]; int count; public AbstractStringBuilder(int capacity) { value = new char[capacity]; } public AbstractStringBuilder append(CharSequence s, int start, int end) { if (s == null) s = "null"; if ((start < 0) || (end < 0) || (start > end) || (end > s.length())) throw new IndexOutOfBoundsException( "start " + start + ", end " + end + ", s.length() " + s.length()); int len = end - start; if (len == 0) return this; int newCount = count + len; if (newCount > value.length) expandCapacity(newCount); for (int i=start; i newCapacity) { newCapacity = minimumCapacity; } value = Arrays.copyOf(value, newCapacity); } public int capacity() { return value.length; } public abstract String toString(); } class StringBuilder extends AbstractStringBuilder { public StringBuilder(int capacity) { super(capacity); } public String toString() { return new String(value, 0, count); } }