Last active
November 2, 2016 15:53
-
-
Save christherama/c7465273fd9db31c98096c56371254f1 to your computer and use it in GitHub Desktop.
Add an element to the ArrayList
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class ArrayList<E> { | |
transient Object[] elementData; | |
private static final int DEFAULT_CAPACITY = 10; // (4) | |
private static final Object[] EMPTY_ELEMENTDATA = {}; | |
private int size; | |
public boolean add(E e) { | |
ensureCapacityInternal(size + 1); // (1) | |
elementData[size++] = e; // (6) | |
return true; | |
} | |
public void ensureCapacity(int minCapacity) { | |
int minExpand = (elementData != EMPTY_ELEMENTDATA) ? 0 : DEFAULT_CAPACITY; | |
if (minCapacity > minExpand) { | |
ensureExplicitCapacity(minCapacity); | |
} | |
} | |
private void ensureCapacityInternal(int minCapacity) { | |
if (elementData == EMPTY_ELEMENTDATA) { // (2) | |
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); | |
} | |
ensureExplicitCapacity(minCapacity); | |
} | |
private void ensureExplicitCapacity(int minCapacity) { | |
modCount++; | |
if (minCapacity - elementData.length > 0) | |
grow(minCapacity); // (3) | |
} | |
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; | |
private void grow(int minCapacity) { | |
// overflow-conscious code | |
int oldCapacity = elementData.length; | |
int newCapacity = oldCapacity + (oldCapacity >> 1); | |
if (newCapacity - minCapacity < 0) | |
newCapacity = minCapacity; | |
if (newCapacity - MAX_ARRAY_SIZE > 0) | |
newCapacity = hugeCapacity(minCapacity); | |
// minCapacity is usually close to size, so this is a win: | |
elementData = Arrays.copyOf(elementData, newCapacity); // (5) | |
} | |
private static int hugeCapacity(int minCapacity) { | |
if (minCapacity < 0) // overflow | |
throw new OutOfMemoryError(); | |
return (minCapacity > MAX_ARRAY_SIZE) ? | |
Integer.MAX_VALUE : | |
MAX_ARRAY_SIZE; | |
} | |
public int size() { | |
return size; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment