# HG changeset patch # User mduigou # Date 1364341756 25200 # Node ID 4a022fae261dbc4d4cf9e371386de82b57d70e54 # Parent 38c1d0c2d6a6083eef8dfcd973f93c4e85b27184 7143928: Optimize empty HashMap and ArrayList Reviewed-by: mduigou Contributed-by: Sergey Linetskiy , John Rose , Mike Duigou diff --git a/src/share/classes/java/util/ArrayList.java b/src/share/classes/java/util/ArrayList.java --- a/src/share/classes/java/util/ArrayList.java +++ b/src/share/classes/java/util/ArrayList.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -104,6 +104,8 @@ { private static final long serialVersionUID = 8683452581122892189L; + private static final Object EMPTY_ELEMENTDATA[] = new Object[0]; + /** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. @@ -111,6 +113,11 @@ private transient Object[] elementData; /** + * initial capacity. + */ + private transient int initialCapacity; + + /** * The size of the ArrayList (the number of elements it contains). * * @serial @@ -129,7 +136,8 @@ if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); - this.elementData = new Object[initialCapacity]; + this.initialCapacity = initialCapacity; + elementData = EMPTY_ELEMENTDATA; } /** @@ -162,8 +170,7 @@ */ public void trimToSize() { modCount++; - int oldCapacity = elementData.length; - if (size < oldCapacity) { + if (size < elementData.length) { elementData = Arrays.copyOf(elementData, size); } } @@ -176,12 +183,21 @@ * @param minCapacity the desired minimum capacity */ public void ensureCapacity(int minCapacity) { - if (minCapacity > 0) + if(elementData != EMPTY_ELEMENTDATA) { + if (minCapacity > 0) ensureCapacityInternal(minCapacity); + } else { + // adjust eventual capacity if requested capacity is larger. + initialCapacity = Math.max(initialCapacity, minCapacity); + } } private void ensureCapacityInternal(int minCapacity) { modCount++; + if(elementData == EMPTY_ELEMENTDATA) { + minCapacity = Math.max(initialCapacity, minCapacity); + } + // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); @@ -702,7 +718,7 @@ s.defaultWriteObject(); // Write out array length - s.writeInt(elementData.length); + s.writeInt((elementData == EMPTY_ELEMENTDATA) ? initialCapacity : elementData.length); // Write out all elements in the proper order. for (int i=0; i