RFR: 8035584: (s) ArrayList(c) should avoid inflation if c is empty
Martin Buchholz
martinrb at google.com
Fri Feb 21 23:03:42 UTC 2014
public ArrayList(int initialCapacity) {
- super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
- this.elementData = new Object[initialCapacity];
+ this.elementData = (initialCapacity > 0)
+ ? new Object[initialCapacity]
+ : EMPTY_ELEMENTDATA;
}
When optimizing for special cases, we should try very hard minimize
overhead in the common case. In the above, we now have two branches in the
common case. Instead,
if (initialCapacity > 0) this.elementData = new Object[initialCapacity];
else if (initialCapacity == 0) this.elementData = EMPTY_ELEMENTDATA;
else barf
On Fri, Feb 21, 2014 at 2:41 PM, Mike Duigou <mike.duigou at oracle.com> wrote:
> Hello all;
>
> This changeset consists of two small performance improvements for
> ArrayList. Both are related to the lazy initialization introduced in
> JDK-8011200.
>
> The first change is in the ArrayList(int capacity) constructor and forces
> lazy initialization if the requested capacity is zero. It's been observed
> that in cases where zero capacity is requested that it is very likely that
> the list never receives any elements. For these cases we permanently avoid
> the allocation of an element array.
>
> The second change, noticed by Gustav Åkesson, involves the
> ArrayList(Collection c) constructor. If c is an empty collection then there
> is no reason to inflate the backing array for the ArrayList.
>
> http://cr.openjdk.java.net/~mduigou/JDK-8035584/0/webrev/
>
> I also took the opportunity to the <tt></tt> -> {@code } conversion for
> the javadoc.
>
> Enjoy!
>
> Mike
More information about the core-libs-dev
mailing list