public class ArrayList<E> extends AbstractList<E>
2 implements List<E>, RandomAccess, Cloneable, java.io.Serializable
3 {
4 private static final long serialVersionUID = 8683452581122892189L;
5
6
7 private static final int DEFAULT_CAPACITY = 10;
8
9
10 private static final Object[] EMPTY_ELEMENTDATA = {};
11
12
13 private transient Object[] elementData;
14
15
16 private int size;
17
18
19 public ArrayList(int initialCapacity) {
20 super();
21 if (initialCapacity < 0)
22 throw new IllegalArgumentException("Illegal Capacity: "+
23 initialCapacity);
24 this.elementData = new Object[initialCapacity];
25 }
26
27
28 public ArrayList() {
29 super();
30 this.elementData = EMPTY_ELEMENTDATA;
31 }
32
33
34 public ArrayList(Collection<? extends E> c) {
35 elementData = c.toArray();
36 size = elementData.length;
37
38 if (elementData.getClass() != Object[].class)
39 elementData = Arrays.copyOf(elementData, size, Object[].class);
40 }
41
42
43
44
45 public boolean add(E e) {
46 ensureCapacityInternal(size + 1);
47 elementData[size++] = e;
48 return true;
49 }
50
51
52 public void add(int index, E element) {
53 rangeCheckForAdd(index);
54
55 ensureCapacityInternal(size + 1);
56 System.arraycopy(elementData, index, elementData, index + 1,
57 size - index);
58 elementData[index] = element;
59 size++;
60 }
61
62 private void ensureCapacityInternal(int minCapacity) {
63 if (elementData == EMPTY_ELEMENTDATA) {
64 minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
65 }
66
67 ensureExplicitCapacity(minCapacity);
68 }
69
70 private void ensureExplicitCapacity(int minCapacity) {
71 modCount++;
72
73
74 if (minCapacity - elementData.length > 0)
75 grow(minCapacity);
76 }
77
78
79 private void grow(int minCapacity) {
80 int oldCapacity = elementData.length;
81
82 int newCapacity = oldCapacity + (oldCapacity >> 1);
83
84
85 if (newCapacity - minCapacity < 0)
86 newCapacity = minCapacity;
87
88 if (newCapacity - MAX_ARRAY_SIZE > 0)
89 newCapacity = hugeCapacity(minCapacity);
90
91
92
93 elementData = Arrays.copyOf(elementData, newCapacity);
94 }
95
96 private static int hugeCapacity(int minCapacity) {
97 if (minCapacity < 0)
98 throw new OutOfMemoryError();
99 return (minCapacity > MAX_ARRAY_SIZE) ?
100 Integer.MAX_VALUE :
101 MAX_ARRAY_SIZE;
102 }
103
104
105 }