1. 程式人生 > >java學習之—實現一個簡單的ArrayList

java學習之—實現一個簡單的ArrayList

package thread1;

/**
 * 實現一個簡單的ArrayList
 *
 * @Title: uminton
 */
public class SimpleArrayList<T> {

    //陣列中元素的大小
    private Integer elementSize = 0;
    //建立SimpleArrayList時,陣列的容量,預設為16
    private Integer arrayCapacity = 16;
    //當陣列容量不夠時,預設每次擴容的大小
    private static final Integer DEFUALT_EXPAND_SIZE = 16;
    //元素容器
    Object[] array = null;

    //無引數構造,設定預設容量
    public SimpleArrayList(){
        this(DEFUALT_EXPAND_SIZE);
    }

    /**
     * 有引數構造,建立容器,設定陣列大小
     * @param arrayCapacity
     */
    public SimpleArrayList(Integer arrayCapacity){
        super();
        if(arrayCapacity < 0){
            throw new IllegalArgumentException("陣列空間越界");
        }
        array = new Object[arrayCapacity];
        this.arrayCapacity = arrayCapacity;
    }

    /**
     * 插入一個新元素,如果陣列可以放下,直接新增
     * 如果陣列中放不下,擴容
     * @param v
     */
    public void add(T v){
        //如果陣列可以放下,直接新增
        if(elementSize < arrayCapacity){
            array[elementSize++] = v;
        }else { //如果陣列放不下,擴容後再新增
            arrayCapacity += DEFUALT_EXPAND_SIZE; //擴容
            System.out.println("陣列放不下擴容:"+arrayCapacity);
            Object[] newArray = new Object[arrayCapacity];
            //建立新的陣列
            System.arraycopy(array,0,newArray,0,array.length);
            //拷貝資料到新的陣列
            array = newArray;
            //從新的陣列賦值到原陣列
            array[elementSize++] = v;//新增
        }
    }

    /**
     * 根據指定下標查詢元素
     * @param index
     * @return
     */
    public T get(int index){
        if(index > elementSize-1 || index < 0){
            throw new ArrayIndexOutOfBoundsException(index);
        }
        return (T) array[index];
    }

    /**
     * 刪除指定位置的元素,所有之後的元素需要前移
     * @param index
     */
    public void remove(int index){
        if(index > elementSize-1 || index < 0){
            throw new ArrayIndexOutOfBoundsException(index);
        }
        for (int i = index; i < elementSize-1; i++) {
            array[i] = array[i+1];  //覆蓋前一個數據
        }
        elementSize--;
    }

    /**
     * 更新指定位置上的元素
     * @param index
     * @param t
     */
    public void update(int index,T t){
        if(index > elementSize-1 || index < 0){
            throw new ArrayIndexOutOfBoundsException(index);
        }
        array[index] = t;
    }

    /**
     * 返回array中元素的大小
     * @return
     */
    public Integer size(){
        return elementSize;
    }

    public Integer capacity(){
        return arrayCapacity;
    }

    public static void main(String[] args) {
        SimpleArrayList<Integer> list = new SimpleArrayList<>();
        //新增
        for (int i = 0; i < 20; i++) {
            list.add(i);
        }
        //遍歷
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");
        }

        //刪除index為10的元素
        list.remove(10);

        for (int i = 0; i < list.size(); i++) {
            System.out.println("index:"+i+";value:"+list.get(i));
        }

        System.out.println("size:" + list.size() + ",capacity:" + list.capacity());
    }

}