package com.pop.practice.homework.first.collection.list; import java.io.Serializable; import java.util.Objects; import com.pop.practice.homework.first.collection.AbstractCollection; import com.pop.practice.homework.first.collection.Iterator; import com.pop.practice.homework.utils.Math; /** * @author haipop Date: 17-2-16 Time: 下午6:33 */ public class ArrayList<T> extends AbstractCollection<T> implements List<T>, Serializable { private static final long serialVersionUID = -3408657766857424074L; /** * 阈值 */ private static final double THRESHOLD = 0.75F; /** * 大小 */ private int size; /** * 当前的存储位置 */ private int flag; /** * 元素集合 */ private Object[] store; /** * 是否容量自增 */ private boolean autoIncrement; /** * 遍历器 */ private Iterator iterator; /** * 默认无参 */ public ArrayList() { this.size = 8; this.flag = 0; this.autoIncrement = true; this.store = new Object[this.size]; } /** * 指定大小,不可自增 */ public ArrayList(int size) { this.size = size; this.flag = 0; this.autoIncrement = false; this.store = new Object[size]; } @Override public Iterator iterator() { this.iterator = new ArrayListIterator(); return iterator; } @Override public boolean hasNext() { return iterator.hasNext(); } @Override @SuppressWarnings("unchecked") public T next() { return (T) iterator.next(); } @Override public boolean isEmpty() { return size == 0; } @Override public int size() { return flag; } @Override public void add(T element) throws IllegalAccessException { assessStore(flag + 1, size, store, flag); flag++; this.store[flag] = element; } private void assessStore(int left, int size, Object[] store, int flag) throws IllegalAccessException { if (!autoIncrement) { return; } double coefficient = Math.div(left, size); if (coefficient > THRESHOLD) { // 达到阈值,拓展 Object[] newStore = new Object[this.size * 2]; System.arraycopy(store, 0, newStore, 0, flag); this.store = newStore; this.size = size * 2; } } @Override public void remove(T element) { for (int i = 0; i < flag; i++) { if (Objects.equals(this.store[i], element)) { System.arraycopy(store, i + 1, store, i, flag - i); flag--; break; } } } @Override public int contain(T element) { int result = -1; for (int i = 0; i < flag; i++) { if (Objects.equals(element, store[i])) { return i; } } return result; } @Override @SuppressWarnings("uncheckd") public T get(int index) throws IndexOutOfBoundsException { return (T) this.store[index]; } private class ArrayListIterator implements Iterator { private int index; ArrayListIterator() { index = 0; } @Override public Iterator iterator() { return new ArrayListIterator(); } @Override public boolean hasNext() { return index < size; } @Override public Object next() { return store[index++]; } } }