No subject

Сергей Цыпанов sergei.tsypanov at yandex.ru
Tue Feb 25 15:43:44 UTC 2020


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


More information about the core-libs-dev mailing list