1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| public class ArrayList<E> extends AbstractList<E> implements List<E> { private static final int DEFAULT_CAPACITY = 10; private int size; private Object[] elementData;
ArrayList(){ elementData = new Object[DEFAULT_CAPACITY]; }
ArrayList(int initCapacity){ if(initCapacity > 0){ elementData = new Object[initCapacity]; }else { throw new IllegalArgumentException("Illegal Capacity" + initCapacity); } }
ArrayList(Collection< ? extends E> c){ elementData = c.toArray(); this.size = elementData.length; if(size != 0){ if(elementData.getClass() != Object[].class){ elementData = copyOf(elementData,size,Object[].class); } } }
@Override @SuppressWarnings("unchecked") public E get(int index) { check(index); return (E) elementData[index]; }
@Override public int size() { return size; }
@Override public boolean add(E e) { ensureCapacity(size + 1); elementData[size] = e; size++; return true; }
@Override public void add(int index, E element) { check(index); ensureCapacity(size + 1); System.arraycopy(elementData,index,elementData,index+1,size - index); elementData[index] = element; size++; }
@Override public boolean remove(Object o) { for(int index = 0; index < size; index++){ if(Objects.equals(o,elementData[index])){ int numMoved = size - index - 1; if(numMoved > 0){ System.arraycopy(elementData, index + 1, elementData, index, numMoved); } elementData[size] = null; size--; return true; } } return false; }
@Override @SuppressWarnings("unchecked") public E remove(int index) { check(index); E oldValue = (E) elementData[index]; int numMoved = size - index - 1; if(numMoved > 0){ System.arraycopy(elementData, index + 1, elementData, index, numMoved); } elementData[size] = null; size--; return oldValue; }
@Override @SuppressWarnings("unchecked") public E set(int index, E element) { check(index); E oldValue = (E) elementData[index]; elementData[index] = element; return oldValue; }
private void check(int index){ if(index < 0 || index > size){ throw new IndexOutOfBoundsException("Index:" + index + "Size:" + size); } } private void ensureCapacity(int minCapacity){ if(minCapacity > elementData.length){ int oldCapacity = elementData.length; int newCapacity = (int) (oldCapacity * 1.5); elementData = Arrays.copyOf(elementData, newCapacity); } } }
|