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
  • [no subject] Сергей Цыпанов
    • Re: Jim Laskey

Reply via email to