[PATCH] Optimization of AbstractStringBuilder.ensureCapacityInternal()

Roman Leventov leventov.ru at gmail.com
Thu Feb 22 17:23:56 UTC 2018


Similar optimizations are also possible in ArrayList and Vector.

On 22 February 2018 at 17:51, Roman Leventov <leventov.ru at gmail.com> wrote:

> AbstractStringBuilder.ensureCapacityInternal() doesn't need to copy the
> whole underlying array, only the part until the current count.
>
> diff --git a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
> b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
> --- a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
> +++ b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
> @@ -140,11 +140,12 @@
>       * overflow, this method throws {@code OutOfMemoryError}.
>       */
>      private void ensureCapacityInternal(int minimumCapacity) {
> +        byte[] oldValue = value;
>          // overflow-conscious code
> -        int oldCapacity = value.length >> coder;
> +        int oldCapacity = oldValue.length >> coder;
>          if (minimumCapacity - oldCapacity > 0) {
> -            value = Arrays.copyOf(value,
> -                    newCapacity(minimumCapacity) << coder);
> +            value = new byte[newCapacity(minimumCapacity) << coder];
> +            System.arraycopy(oldValue, 0, value, 0, count << coder);
>          }
>      }
>


More information about the core-libs-dev mailing list