[PATCH] java.util.Collections enhancement
David Holmes
david.holmes at oracle.com
Mon Sep 11 21:27:58 UTC 2017
Moving to core-libs-dev ...
On 12/09/2017 5:40 AM, Сергей Цыпанов wrote:
> Hi,
>
> looking into the code of java.util.Collections I've found out that EmptyList#toArray() and EmptySet#toArray() both instantiate new instance of Object[] at each call. As far as Java array is immutable it's possible to cache empty Object array and return this cached instance.
There is a slight issue with the specification of toArray here:
"The returned array will be "safe" in that no references to it are
maintained by this list. (In other words, this method must allocate a
new array even if this list is backed by an array). "
Of course for a zero-sized array it is perfectly safe to return a cached
array, but the spec currently requires that a new array be returned.
Cheers,
David
-----
> Patch.txt is attached to the body of this mail.
>
> Thanks,
> - Sergei Tsypanov
>
> patch.txt
>
> diff --git a/src/java.base/share/classes/java/util/Collections.java b/src/java.base/share/classes/java/util/Collections.java
> --- a/src/java.base/share/classes/java/util/Collections.java
> +++ b/src/java.base/share/classes/java/util/Collections.java
> @@ -108,6 +108,11 @@
> private static final int INDEXOFSUBLIST_THRESHOLD = 35;
>
> /**
> + * Cached empty array
> + */
> + private static final Object[] EMPTY_ARRAY = {};
> +
> + /**
> * Sorts the specified list into ascending order, according to the
> * {@linkplain Comparable natural ordering} of its elements.
> * All elements in the list must implement the {@link Comparable}
> @@ -4329,7 +4334,7 @@
> public boolean contains(Object obj) {return false;}
> public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
>
> - public Object[] toArray() { return new Object[0]; }
> + public Object[] toArray() { return EMPTY_ARRAY; }
>
> public <T> T[] toArray(T[] a) {
> if (a.length > 0)
> @@ -4458,7 +4463,7 @@
> public boolean contains(Object obj) {return false;}
> public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
>
> - public Object[] toArray() { return new Object[0]; }
> + public Object[] toArray() { return EMPTY_ARRAY; }
>
> public <T> T[] toArray(T[] a) {
> if (a.length > 0)
More information about the jdk9-dev
mailing list