数据结构: Java中ArrayList的简单实现

来源:互联网 发布:linux文件类型 编辑:程序博客网 时间:2024/06/05 16:19

上学期的数据结构这门课学到了图。用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);        }    }}
0 0