package xdx.homework.first; public class ArrayList<E> implements List<E> { private Object[] elements; // 列表长度,默认10个元素 private int size = 10; // 最后一个元素的位置 private int position = -1; public ArrayList() { elements = new Object[size]; } public ArrayList(final int capacity) { if (capacity <= 0) throw new RuntimeException("列表长度不可小于等于0!"); elements = new Object[capacity]; } /** * 添加元素 * * @param e 要添加的元素 * @return */ @Override public boolean add(E e) { if (++position > size - 1) { grow(); } elements[position] = e; return true; } /** * 删除指定索引的元素 * * @param index 索引下标 * @return */ @Override @SuppressWarnings("unchecked") public E remove(int index) { if (index < 0 || index > position || this.isEmpty()) throw new IndexOutOfBoundsException("要删除的索引不正确!"); E returnElement = (E) elements[index]; elements[index] = null; System.arraycopy(elements, index + 1, elements, index, position + 1 - index); position--; return returnElement; } /** * 删除指定的元素 * * @param e * @return */ @Override public boolean remove(E e) { if (!this.contains(e)) return false; int removeIndex = 0; for(int i = 0; i < this.position; i++) { if(elements[i].equals(e)) { removeIndex = i; break; } } remove(removeIndex); return true; } /** * 返回列表长度 * * @return */ @Override public int size() { return position + 1; } /** * 判断列表是否为空 * * @return */ @Override public boolean isEmpty() { return position == -1; } /** * 获取指定索引的元素 * * @param index * @return */ @Override @SuppressWarnings("unchecked") public E get(int index) { if (index > position) return null; return (E)elements[index]; } /** * 重置某个索引的元素 * * @param index * @param o * @return */ @Override public boolean set(int index, Object o) { if (index > position) return false; elements[index] = null; elements[index] = o; return true; } /** * 判断是否包含某个元素 * * @param o * @return */ @Override public boolean contains(Object o) { if(this.isEmpty()) return false; for(int i = 0; i <= position; i++) { if (elements[i].equals(o)) return true; } return false; } /** * 清空列表 */ @Override public void clear() { for(int i = 0; i <= this.size(); i++) { elements[i] = null; } position = -1; } /** * 取得迭代器 * * @return */ @Override public Iterator<E> iterator() { return new Itr(); } /** * 数组增长 */ private void grow() { Object[] newElements = new Object[size << 1]; System.arraycopy(elements, 0, newElements, 0, this.size); size = size << 1; elements = null; elements = newElements; } private class Itr implements Iterator<E> { private int itrIndex = 0; @Override public boolean hasNext() { return get(itrIndex) != null; } @Override @SuppressWarnings("unchecked") public E next() { return (E) elements[itrIndex++]; } @Override public void remove() { ArrayList.this.remove(itrIndex); } } @Override public String toString() { if(this.isEmpty()) { return "[]"; } StringBuilder strList = new StringBuilder("["); for(int i = 0; i < this.size(); i++) { strList.append(elements[i].toString()).append(","); } strList.deleteCharAt(strList.length() - 1); strList.append("]"); return strList.toString(); } }