【java集合】自己實現簡易的ArrayList,java集合arraylist
List介面:
public interface IMyList<E> { E set(int index, E elem); boolean add(E e); boolean remove(Object o); E remove(int index); int indexOf(Object o); E get(int index); int size(); boolean isEmpty();}
ArrayList實現:
import java.util.Arrays;public class MyArrayList<E> implements IMyList<E> { private Object[] elementData; private int size; public MyArrayList(){ this(10); } public MyArrayList(int initialCapacity) { this.elementData = new Object[initialCapacity]; } @Override public E set(int index, E elem) { E oldElem = elementData(index); elementData[index] = elem; return oldElem; } //添加元素前要確認空間是否足夠,不夠的話要進行擴容後再添加 @Override public boolean add(E e) { ensureCapacity(size+1); elementData[size++] = e; return true; } @Override public boolean remove(Object o) { if (o == null){ for (int i=0, len=elementData.length; i<len; i++) if (o == elementData[i]){ fastRemove(i); return true; } } else { for (int i=0, len=elementData.length; i<len; i++) if (o.equals(elementData[i])){ fastRemove(i); return true; } } return false; } @Override public E remove(int index) { E oldElem = elementData(index); fastRemove(index); return oldElem; } private void fastRemove(int index){ /** * 源碼是這樣的 * int numMoved = size - index - 1; * if (numMoved > 0) * System.arraycopy(elementData, index+1, elementData, index, numMoved); * */ for (int i=index+1; i<size; i++){ elementData[i-1] = elementData[i]; } elementData[--size] = null; } @Override public int indexOf(Object o) { for (int i=0, len=elementData.length; i<len; i++) if (o == elementData[i]) return i; return -1; } @Override public E get(int index) { return elementData(index); } @Override public int size() { return size; } @Override public boolean isEmpty() { return size == 0; } private E elementData(int index){ return (E)elementData[index]; } //如果空間不夠,要進行擴容,擴容後大小為原來的1.5倍 private void ensureCapacity(int size){ if (size > elementData.length){ int oldCapacity = elementData.length; int newCapacity = (oldCapacity >> 1) + oldCapacity; elementData = Arrays.copyOf(elementData, newCapacity); } }}
測試代碼:
public class Main { public static void main(String[] args) { IMyList<String> list = new MyArrayList<String>(); for (int i=0; i<12; i++){ list.add("s" + i); } list.remove("s3"); for (int i=0; i<list.size(); i++){ System.out.println(list.get(i)); } }}
運行結果:
s0s1s2s4s5s6s7s8s9s10s11
查看評論