數據結構: Java中ArrayList的簡單實現

上學期的數據結構這門課學到了圖。用C語言把書上介紹的內容都實現了一遍,但感覺學校教的都太基礎了。

這個學期準備先重溫一下,然後再深入一點學習算法和數據結構。
語言使用Java, 目前買了3本書《Algorithms (4th edition)》、《數據結構預算法 Java語言描述》、《算法分析與設計基礎》

下面是我自己實現的簡單版本的支持泛型的線性表。
ArrayList的優點: get和set方法的運行時間爲O(1)
ArrayList的缺點: add和remove操作爲花費的時間很多,除非是在表的末尾。

MyArrayList底層使用數組來實現,所以需要考慮數組下標和容量問題。如果容量不夠的時候,需要自動增加容量。trimToSize()方法可以釋放多餘的容量,使之與線性表的長度相匹配。
ArrayListIterator爲了跟MyArrayList更好地通信,所以作爲MyArrayList的內部類。

package list;
import java.util.Iterator;


public class MyArrayList<T> implements Iterable<T> {

    //默認容量和增量
    private static final int DEFAULT_CAPACITY = 10;
    private static final int CAPACITY_INCREMENT = 5;

    //存放的元素數量
    private int size = 0;
    //數組本身
    private T[] items;

    /**
     * 默認初始化10容量的數組
     */
    public MyArrayList() {
        super();
        init();
    }

    /**
     * 初始化initSize容量的數組
     * @param initSize
     */

    public MyArrayList(int initSize) {
        super();
        init(initSize);
    }

    @SuppressWarnings("unchecked")
    private void init(){
        items = (T[]) new Object[DEFAULT_CAPACITY];
    }

    @SuppressWarnings("unchecked")
    private void init(int initSize){
        items = (T[]) new Object[initSize];
    }

    public void clear(){
        size = 0;
        init();
    }

    @SuppressWarnings("unchecked")
    public void trimToSize(){
        T[] newItems = (T[]) new Object[size];
        for(int i=0; i<size; i++){
            newItems[i] = items[i];
        }
        items = newItems;
    }

    public boolean isEmpty(){
        return size == 0;
    }

    public int size(){
        return size;
    }

    /**
     * 在數組末尾添加一個T類型的item
     * @param item  插入的item值
     * @return
     */
    public void add(T item){
        ensureCapacity();
        items[size] = item;
        ++size;
    }

    /**
     * 在索引位置插入一個item
     * @param idx   索引位置
     * @param item  插入的item的值
     * @return
     */
    public void add(int idx, T item){
        if(idx < 0 || idx > size){
            throw new ArrayIndexOutOfBoundsException();
        }
        ensureCapacity();
        for(int i=size;i>idx;i--){
            items[i] = items[i-1];
        }
        items[idx] = item;
        ++size;
    }

    /**
     * 獲取索引位置的元素
     * @param idx   索引位置
     * @return
     */
    public T get(int idx){
        if(idx < 0 || idx >= size){
            throw new ArrayIndexOutOfBoundsException();
        }
        return (T) items[idx];
    }

    /**
     * 將idx位置的元素設置成item
     * @param idx   索引位置
     * @param item  新的item值
     * @return      舊的idx位置的item值
     */
    public T set(int idx, T item){
        if(idx < 0 || idx >= size){
            throw new ArrayIndexOutOfBoundsException();
        }
        T oldItem = items[idx];
        items[idx] = item;
        return oldItem;
    }

    /**
     * 移除idx處的元素
     * @param idx   元素的索引
     * @return      返回被移除的item
     */
    public T remove(int idx){
        if(idx < 0 || idx >= size){
            throw new ArrayIndexOutOfBoundsException();
        }
        T oldItem = items[idx];
        for(int i=idx;i<size-1;i++){
            items[i] = items[i+1];
        }
        size--;
        return oldItem;
    }


    /**
     * 數組容量不夠時增加容量,確保不會越界。重要
     */
    @SuppressWarnings("unchecked")
    private void ensureCapacity(){
        if(size==items.length){
            T[] newItems = (T[]) new Object[size+CAPACITY_INCREMENT];
            for(int i=0; i<size; i++){
                newItems[i] = items[i];
            }
            items = newItems;
        }
    }

    @Override
    public Iterator<T> iterator() {
        return new ArrayListIterator();
    }

    private class ArrayListIterator implements Iterator<T>{

        private int position = 0;

        @Override
        public boolean hasNext() {
            return position < size();
        }

        @Override
        public T next() {
            return (T) items[position++];
        }

        public void remove(){
            MyArrayList.this.remove(--position);
        }
    }
}
發佈了28 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章