Hi all,

In Java 9, compact strings were added. Ever since, I've been trying to use getChars instead of charAt for Strings. However, I prefer to also do the same for StringBuilder and StringBuffer. This can lead to some special cases. For instance, in Apache Commons I/O: https://github.com/apache/commons-io/blob/master/src/main/java/org/apache/commons/io/input/CharSequenceReader.java#L232

Is it perhaps not a good idea to add getChars as a default method to CharSequence? The implementation is simple enough:

default void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) {
        Objects.checkFromToIndex(srcBegin, srcEnd, length());
        int n = srcEnd - srcBegin;
        Objects.checkFromIndexSize(dstBegin, n, dst.length);
        for (int i = srcBegin; i < srcEnd; i++) {
            dst[dstBegin++] = charAt(i);
        }
    }

String, StringBuilder and StringBuffer automatically override it with their own methods, so these won't have to change at all.


I've already worked a bit on this, including more efficient overrides for CharBuffer and StringCharBuffer. The only other known implementation, Segment, won't profit much from a custom implementation, so I skipped it.

Should I continue with my work, or is it something that's considered not necessary? Adding it would allow a better implementation of Writer.append. For large CharSequences, that's currently hopelessly inefficient - first it converts the CharSequence to String, then to char[]. Instead, it could be implemented like write(String, int, int), with only one conversion (CharSequence to char[]).


Kind regards,

Rob

Reply via email to