package com.easy.util.myarraylist; import com.easy.util.myiterator.Iterator; public class ArrayList{ private static final Object[] EMPTY_ELEMENTDATA = {}; private Object[] elementData; private int size; // region 构造函数 public ArrayList() { this.elementData = EMPTY_ELEMENTDATA; } public ArrayList(int initialCapacity) { if (initialCapacity < 0) { throw new IllegalArgumentException("Illegal Capacity:" + initialCapacity); } this.elementData = new Object[initialCapacity]; } // endregion // region add方法 public boolean add(Object o) { if (elementData.length <= size) { grow(1); } elementData[size++] = o; return true; } public void add(int index, Object o) { rangeCheckForAdd(index); grow(1); System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = o; size++; } // endregion // region get方法 public Object get(int index) { rangeCheck(index); return elementData[index]; } // endregion // region remove方法 public Object remove(int index) { rangeCheck(index); Object oldValue = elementData[index]; /* * int numMoved=size-index-1; if(numMoved>0){ * System.arraycopy(elementData, index+1, elementData, index, numMoved); * } elementData[--size]=null; */ fastRemove(index); 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 (elementData[index].equals(o)) { fastRemove(index); return true; } } } return false; } // endregion // region size方法 public int size() { return size; } // endregion // region toString方法 @Override public String toString() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < size(); i++) { sb.append(elementData[i] + ","); } /* * for (Object object : elementData) { sb.append(object + ","); } */ String temp = sb.toString(); temp = temp.substring(0, temp.length() - 1); return "[" + temp + "]"; } // endregion // region 私有方法 private void grow(int minCapacity) { Object[] dest = new Object[elementData.length + minCapacity]; System.arraycopy(elementData, 0, dest, 0, elementData.length); elementData = dest; } private void rangeCheck(int index) { if (index >= size) { throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } } private String outOfBoundsMsg(int index) { return "Index:" + index + ",Size:" + size; } private void rangeCheckForAdd(int index) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } } private void fastRemove(int index) { int numMoved = size - index - 1; if (numMoved > 0) { System.arraycopy(elementData, index + 1, elementData, index, numMoved); } elementData[--size] = null; } // endregion // region 下一版本迭代的功能 private static final int DEFAULT_CAPACITY = 10; private void ensureCapacityInternal(int minCapacity) { if (elementData == EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureCapacityInternal(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { if (minCapacity - elementData.length > 0) { grow(minCapacity); } } //endregion int currentIndex ; public Iterator iterator(){ currentIndex=-1; return new Iterator() { @Override public Object next() { return elementData[++currentIndex]; } @Override public boolean hasNext() { return currentIndex<size-1; } }; } }