Hello, current implementation of String.substring(int,int) has a fast-path for the case when beginIndex = 0 and endIndex = length.
I think there should be similar fast-path for the case beginIndex = endIndex (asuming both are valid): diff --git a/src/java.base/share/classes/java/lang/String.java b/src/java.base/share/classes/java/lang/String.java --- a/src/java.base/share/classes/java/lang/String.java +++ b/src/java.base/share/classes/java/lang/String.java @@ -1900,10 +1900,13 @@ public String substring(int beginIndex, int endIndex) { int length = length(); checkBoundsBeginEnd(beginIndex, endIndex, length); - int subLen = endIndex - beginIndex; if (beginIndex == 0 && endIndex == length) { return this; } + int subLen = endIndex - beginIndex; + if (subLen == 0) { + return ""; + } return isLatin1() ? StringLatin1.newString(value, beginIndex, subLen) : StringUTF16.newString(value, beginIndex, subLen); } With this call to str.substring(n,n) will be allocation-free. Regards, Sergey Tsypanov