5 * @author Andre Nijholt
\r
7 public class ArrayList {
\r
8 private static final int INITIAL_CAPACITY = 7;
\r
9 private static final int CAPACITY_INCREMENT = 3;
\r
11 protected Object[] elementData;
\r
12 protected int capacityIncrement;
\r
13 protected int elementCount;
\r
15 public ArrayList(int initialCapacity) {
\r
16 if (initialCapacity < 0) initialCapacity = 0;
\r
17 elementData = new Object[initialCapacity];
\r
18 capacityIncrement = CAPACITY_INCREMENT;
\r
22 public ArrayList(Object[] elements) {
\r
23 // Set initial capacity to 130% (normally specified 110%)
\r
24 this((elements.length * 13) / 10);
\r
28 public ArrayList() {
\r
29 this(INITIAL_CAPACITY);
\r
32 public void add(int index, Object element) {
\r
33 if (index > elementCount) {
\r
34 throw new ArrayIndexOutOfBoundsException();
\r
37 ensureCapacity(elementCount + 1);
\r
38 for (int i = elementCount; i > index; i--) {
\r
39 elementData[i] = elementData[i - 1];
\r
41 elementData[index] = element;
\r
46 public void add(Object o) {
\r
47 ensureCapacity(elementCount + 1);
\r
48 elementData[elementCount++] = o;
\r
51 public void addAll(Object [] elements) {
\r
52 if (elements == null) return;
\r
53 ensureCapacity(elementCount + elements.length);
\r
55 for (int i = 0; i < elements.length; i++) {
\r
56 elementData[elementCount++] = elements[i];
\r
60 public void addAll(int index, Object [] elements) {
\r
61 if (elements == null) return;
\r
62 if (index > elementCount) {
\r
63 throw new ArrayIndexOutOfBoundsException();
\r
66 ensureCapacity(elementCount + elements.length);
\r
67 for (int i = elementCount + elements.length - 1; i > index; i--) {
\r
68 elementData[i] = elementData[i - elements.length];
\r
70 for (int i = 0; i < elements.length; i++) {
\r
71 elementData[i + index] = elements[i];
\r
76 public void clear() {
\r
77 for (int i = 0; i < elementCount; i++) {
\r
78 elementData[i] = null;
\r
82 public boolean contains(Object o) {
\r
83 for (int i = 0; i < elementCount; i++) {
\r
84 if (elementData[i].equals(o)) return true;
\r
90 public Object get(int index) {
\r
91 if (index > elementCount) {
\r
92 throw new ArrayIndexOutOfBoundsException();
\r
95 return elementData[index];
\r
98 public int indexOf(Object o) {
\r
99 for (int i = 0; i < elementCount; i++) {
\r
100 if (elementData[i].equals(o)) return i;
\r
106 public int lastIndexOf(Object o) {
\r
107 for (int i = elementCount - 1; i >= 0; i--) {
\r
108 if (elementData[i].equals(o)) return i;
\r
114 public boolean isEmpty() {
\r
115 return (elementCount == 0);
\r
118 public Object remove(int index) {
\r
119 if (index > elementCount) {
\r
120 throw new ArrayIndexOutOfBoundsException();
\r
123 Object o = elementData[index];
\r
124 for (int i = index; i < elementCount; i++) {
\r
125 elementData[i] = elementData[i + 1];
\r
131 public Object set(int index, Object element) {
\r
132 if (index > elementCount) {
\r
133 throw new ArrayIndexOutOfBoundsException();
\r
136 Object o = elementData[index];
\r
137 elementData[index] = element;
\r
141 public int size() {
\r
142 return elementCount;
\r
145 private void ensureCapacity(int minCapacity) {
\r
146 if (elementData.length < minCapacity) {
\r
147 int newCapacity = (capacityIncrement > 0)
\r
148 ? (elementData.length + capacityIncrement)
\r
149 : (elementData.length * 2);
\r
150 if (newCapacity < minCapacity) {
\r
151 newCapacity = minCapacity;
\r
154 Object oldData[] = elementData;
\r
155 elementData = new Object[newCapacity];
\r
156 arraycopy(oldData, 0, elementData, 0, elementCount);
\r
160 private void arraycopy(Object[] src, int srcOffset, Object[] dst, int dstOffset, int length) {
\r
161 for (int i = 0; i < length; i++)
\r
162 dst[i + dstOffset] = src[i + srcOffset];
\r