package com.myutil; import java.text.MessageFormat; import java.util.NoSuchElementException; /** * 数组列表 */ public class ArrayList<T> implements List<T> { private Object[] elementData; private int size = 0; private static final int DEFAULT_SIZE = 10; /** * 判断边界 * <p> * <pre> * 若 index < 0 或者 index > size 则抛出非法参数异常 * </pre> * * @param index 当前索引 */ private void judgeRange(int index) { if (index < 0) { throw new IllegalArgumentException( MessageFormat.format("Index is must be great or equal then 0. index:{0}", index)); } if (index >= this.size) { throw new IllegalArgumentException( MessageFormat.format("Index is must be less then size(). index:{0}", index)); } if (this.size == Integer.MAX_VALUE) { throw new IllegalArgumentException("Array already can not Expansion."); } } /** * 扩充数组容量 * <p> * <pre> * 若 size >= elementData.length 则对数组进行扩容 * 扩容至原(elementData.length+1) * 2 * </pre> */ private void capacityExpansion() { if (this.size >= elementData.length) { Object[] tmpData = new Object[(elementData.length + 1) * 2]; System.arraycopy(elementData, 0, tmpData, 0, elementData.length); elementData = tmpData; } } public ArrayList() { elementData = new Object[DEFAULT_SIZE]; } public ArrayList(int capacity) { if (capacity < 0) { throw new IllegalArgumentException( MessageFormat.format("Capacity is must be great or equal 0. capacity:{0}", capacity)); } this.elementData = new Object[capacity]; } public void add(T element) { capacityExpansion(); elementData[this.size] = element; this.size++; } public void add(T element, int index) { judgeRange(index); capacityExpansion(); if (this.size - index > 0) { System.arraycopy(elementData, index, elementData, index + 1, this.size - index); } elementData[index] = element; this.size++; } public T remove(int index) { judgeRange(index); T tmpObject = (T) elementData[index]; if (this.size - index > 0) { System.arraycopy(elementData, index + 1, elementData, index, this.size - index - 1); } this.size--; return tmpObject; } public T get(int index) { judgeRange(index); return (T) elementData[index]; } public int size() { return this.size; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("["); for (int i = 0; i < this.size; i++) { sb.append((T) elementData[i]); if (i < this.size - 1) { sb.append(","); } } sb.append("]"); return sb.toString(); } /** * 获取迭代器 * * @return 迭代器 */ public Iterator<T> iterator() { return new ArrayListIterator(); } private class ArrayListIterator implements Iterator<T> { int position = 0; int lastRet = -1; public boolean hasNext() { return position < ArrayList.this.size(); } public T next() { if (position >= size) { throw new NoSuchElementException(); } int i = position; T element = ArrayList.this.get(position++); lastRet = i; return element; } public T remove() { if (lastRet < 0) { throw new IllegalStateException(); } T removeElement = ArrayList.this.remove(lastRet); position = lastRet; lastRet = -1; return removeElement; } } public static void main(String[] args) { ArrayList<Integer> ids = new ArrayList<>(); for (int i = 0; i < 11; i++) { ids.add(i); } Iterator iterator = ids.iterator(); System.out.println(ids); } }