自定義實現ArrayList很簡單,只須要明白下面幾點數組
一、ArrayList 底層是由數組組成的app
二、數組有容量限制,可是ArrayList並無(實際上也有,Integer.MAX_VALUE)。在增長數據的時候作好擴容函數
三、移除數組中的某一個數據要怎麼作測試
下面是我自定義的ArrayList。基本的增刪改查是有了。ui
public class MyArrayList<E> { private int capacity = 10; //arrayList 容量 private Object[] element = new Object[capacity]; //構成arrayList的底層數組 int size; //arrayList中存在的元素 size <= capacity int next; //數組索引 永遠指向下一個添加的數據位置 /** * <默認構造函數> */ public MyArrayList() { } /** * <默認構造函數> */ public MyArrayList(int capacity) { this.capacity = capacity; } /** * 添加數據 * <功能詳細描述> * @param e * @see [類、類#方法、類#成員] */ public void add(E e) { if(e == null) { throw new NullPointerException("cannot add null object"); } checkSize(); //檢查數組容量 if(size <= capacity/2) { //若是size <= capacity/2 不進行擴容直接添加 element[size] = e; size ++; }else { //擴容 growCapacity(); element[size] = e; size ++; } } /** * 獲取inde指向的數據 * <功能詳細描述> * @param index * @return * @see [類、類#方法、類#成員] */ public E get(int index) { if(index > size-1) { throw new ArrayIndexOutOfBoundsException("index out of size, " + index); } return (E)element[index]; } /** * 移除index指向的數據 * <功能詳細描述> * @param index * @see [類、類#方法、類#成員] */ public E remove(int index) { if(index > size-1) { throw new ArrayIndexOutOfBoundsException("index out of size, " + index + "size :" + size); } Object result = element[index]; System.arraycopy(element, index+1, element, index, size-index-1); element[--size] = null; return (E)result; } /** * 修改數據 * <功能詳細描述> * @param index * @param e * @see [類、類#方法、類#成員] */ public void change(int index, E e) { if(index > size-1) { throw new ArrayIndexOutOfBoundsException("index out of size, " + index); } if(e == null) { throw new NullPointerException("cannot add null object"); } element[index] = e; } /** * {@inheritDoc} */ public String toString() { StringBuilder sbBuilder = new StringBuilder(); for(int i=0;i<size;i++) { sbBuilder.append("("+i+","+element[i]+"),"); } String result = sbBuilder.toString(); result = result.substring(0,result.length()-1); return result; } /** * 檢查容量 * <功能詳細描述> * @return * @see [類、類#方法、類#成員] */ private void checkSize() { if(size > capacity || size > Integer.MAX_VALUE) { throw new ArrayIndexOutOfBoundsException("size too large, " + size); } } /** * 將數組進行擴容 * <功能詳細描述> * @see [類、類#方法、類#成員] */ private void growCapacity() { if(capacity > Integer.MAX_VALUE) { throw new ArrayIndexOutOfBoundsException("capacity too large, " + capacity); } int newCapacity = capacity + capacity >> 1; //新的容量 = 老容量 + 老容量的1/2 element = Arrays.copyOf(element, newCapacity); capacity = newCapacity; } }
寫一個main函數測試一下this
public class TestList { public static void main(String[] args) { MyArrayList<String> list = new MyArrayList<String>(); for(int i=0;i<10;i++) { list.add(i+""); } System.out.println(list.toString()); String s = list.get(6); System.out.println(s); System.out.println(list.remove(5)); System.out.println(list.toString()); } }
下面是運行結果spa