自定義ArrayList

自定義實現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

相關文章
相關標籤/搜索