Created
July 10, 2013 10:36
-
-
Save lichenbo/5965288 to your computer and use it in GitHub Desktop.
This file contains hidden or 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 void ensureCapacity(int minCapacity) { | |
| if (minCapacity > 0) | |
| ensureCapacityInternal(minCapacity); | |
| } | |
| private void ensureCapacityInternal(int minCapacity) { | |
| modCount++; | |
| if (minCapacity - elementData.length > 0) | |
| grow(minCapacity); | |
| } | |
| private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; | |
| private void grow(int minCapacity) { | |
| int oldCapacity = elementData.length; | |
| int newCapacity = oldCapacity + (oldCapacity >> 1); | |
| if (newCapacity - minCapacity < 0) | |
| newCapacity = minCapacity; | |
| if (newCapacity - MAX_ARRAY_SIZE > 0) | |
| newCapacity = hugeCapacity(minCapacity); | |
| elementData = Arrays.copyOf(elementData, newCapacity); | |
| } | |
| private static int hugeCapacity(int minCapacity) { | |
| if (minCapacity < 0) | |
| throw new OutOfMemoryError(); | |
| return (minCapacity > MAX_ARRAY_SIZE) ? | |
| Integer.MAX_VALUE : | |
| MAX_ARRAY_SIZE; | |
| } | |
| public boolean add(E e) { | |
| ensureCapacityInternal(size + 1); // Increments modCount!! | |
| elementData[size++] = e; | |
| return true; | |
| } | |
| public void add(int index, E element) { | |
| rangeCheckForAdd(index); | |
| ensureCapacityInternal(size + 1); // Increments modCount!! | |
| System.arraycopy(elementData, index, elementData, index + 1, | |
| size - index); | |
| elementData[index] = element; | |
| size++; | |
| } | |
| public E remove(int index) { | |
| rangeCheck(index); | |
| modCount++; | |
| E oldValue = elementData(index); | |
| int numMoved = size - index - 1; | |
| if (numMoved > 0) | |
| System.arraycopy(elementData, index+1, elementData, index, | |
| numMoved); | |
| elementData[--size] = null; // Let gc do its work | |
| return oldValue; | |
| } | |
| public boolean remove(Object o) { | |
| if (o == null) { | |
| for (int index = 0; index < size; index++) | |
| if (elementData[index] == null) { | |
| fastRemove(index); | |
| return true; | |
| } | |
| } else { | |
| for (int index = 0; index < size; index++) | |
| if (o.equals(elementData[index])) { | |
| fastRemove(index); | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| private void fastRemove(int index) { | |
| modCount++; | |
| int numMoved = size - index - 1; | |
| if (numMoved > 0) | |
| System.arraycopy(elementData, index+1, elementData, index, | |
| numMoved); | |
| elementData[--size] = null; // Let gc do its work | |
| } | |
| public void clear() { | |
| modCount++; | |
| for (int i = 0; i < size; i++) | |
| elementData[i] = null; | |
| size = 0; | |
| } | |
| public boolean addAll(Collection<? extends E> c) { | |
| Object[] a = c.toArray(); | |
| int numNew = a.length; | |
| ensureCapacityInternal(size + numNew); | |
| System.arraycopy(a, 0, elementData, size, numNew); | |
| size += numNew; | |
| return numNew != 0; | |
| } | |
| public boolean addAll(int index, Collection<? extends E> c) { | |
| rangeCheckForAdd(index); | |
| Object[] a = c.toArray(); | |
| int numNew = a.length; | |
| ensureCapacityInternal(size + numNew); | |
| int numMoved = size - index; | |
| if (numMoved > 0) | |
| System.arraycopy(elementData, index, elementData, index + numNew, | |
| numMoved); | |
| System.arraycopy(a, 0, elementData, index, numNew); | |
| size += numNew; | |
| return numNew != 0; | |
| } | |
| protected void removeRange(int fromIndex, int toIndex) { | |
| modCount++; | |
| int numMoved = size - toIndex; | |
| System.arraycopy(elementData, toIndex, elementData, fromIndex, | |
| numMoved); | |
| int newSize = size - (toIndex-fromIndex); | |
| while (size != newSize) | |
| elementData[--size] = null; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment