Hi, This idea has been brought up before [1].
I concur with Pavel's assessment. I would add that now that latin-1 Strings are stored in a more compact form in JDK 9 ("Compact Strings" [2]), the performance profile of string data is further complicated.
Thanks, -Brent 1. https://bugs.openjdk.java.net/browse/JDK-6206838 2. https://bugs.openjdk.java.net/browse/JDK-8054307 On 07/29/2016 10:21 AM, Pavel Rappo wrote:
Once again, while I agree in some places it could have been done a bit better probably, I would say it's good to a have a look at benchmarks first. If they show there's indeed a big difference between char[] copy = new chars[charSequence.length()]; String s = charSequence.toString(); s.getChars(0, s.length, copy, 0); and char[] copy = new chars[charSequence.length()]; charSequence.getChars(0, charSequence.length(), copy, 0); it could justify an increase in complexity of CharBuffer.append or introducing a new default method (getChars/fillInto) into CharSequence. Possibly. Or maybe not. Because there might be some nontrivial effects we are completely unaware of. Btw, what do you mean by "extract char[]" from StringBuilder? Do you want StringBuilder to give away a reference to its char[] outside? If not, than what's the difference between "extract char[]" from StringBuilder and "use String" in your algorithm? The bottom line is whatever you suggest would likely need a good justification. To me it's not immediately obvious that something like this public CharBuffer append(CharSequence csq) { if (csq == null) { put("null"); } else if (csq instanceof StringBuilder) { char[] chars = new char[csq.length()]; ((StringBuilder) csq).getChars(0, csq.length(), chars, 0); put(chars); } else if (csq instanceof StringBuffer) { char[] chars = new char[csq.length()]; ((StringBuffer) csq).getChars(0, csq.length(), chars, 0); put(chars); } else if (csq instanceof CharBuffer) { CharBuffer buffer = (CharBuffer) csq; int p = buffer.position(); put(buffer); buffer.position(p); } else { for (int i = 0; i < csq.length(); i++) { put(csq.charAt(i)); } } return this; } is better than this (what's there today) public CharBuffer append(CharSequence csq) { if (csq == null) return put("null"); else return put(csq.toString()); }On 29 Jul 2016, at 15:12, [email protected] wrote: Hello, Have to agree with Fabian handling CharSequences (and special case StringBuilder) is pretty weak, in CharBuffer.append(CharSequence) you see the same toString. I would expect it to do: - Instamceof String -> use it - Instance of StringBuilder -> extract char[] and iterate - Instance of CharBuffer -> handle - Otherwise: Loop over charAt (the otherwise might be a tradeof between allocation and (not)inlined bounds checks) Alternative would be a CharSequence.fillInto(char[]) BTW wouldn't it be create if char[] implements CharSequence? Gruss Bernd -- http://bernd.eckenfels.net From Win 10 Mobile Von: Fabian Lange
