JAVA學習- 數據結構 - ArrayList

說明https://mp.csdn.net/mdeditor/94589662#

自己嘗試寫一個ArrayList。寫的方法都是一些基本方法,沒有很花裏胡哨。ArrayList和下一篇的LinkedList是鏈表類中兩個核心。這篇主要是ArrayList,個人感覺ArrayList好像比LinkedList難寫一些。有一些迷。
下面是代碼:

/*
真正的ArrayList是有modCount進行記錄是否更改的
但是這個程序並沒有。ArrayList是線程不安全的。
故這個程序中的迭代器實現是存在問題的,因爲它無法發現ArrayList是否已經更改,但是如果有modCount通過一些手段發現。
ArrayList和LinkedList都是線程不安全的,都有modCount(這個值在他們的父類中定義)記錄是否已經更改
 */

package code.hc.util;

import java.util.Arrays;

public class HArrayList<E> implements HList<E> {
    private static final int DEFAULT_CAPACITY = 10;
    private static final Object[] EMPTY_ELEMENT_DATA = {};
    private Object[] elementData;
    private int size;

    public HArrayList(){
        elementData = new Object[DEFAULT_CAPACITY];
        size = 0;
    }

    public HArrayList(int initial_capacity){
        if(initial_capacity < 0) throw new IllegalArgumentException("initial_capacity : " + initial_capacity);
        if(initial_capacity == 0){
            elementData = EMPTY_ELEMENT_DATA;
        }else {
            this.elementData = new Object[initial_capacity];
        }
        size = 0;
    }

    public void ensureCapacity(int minCapacity){
        int oldCapacity = elementData.length;
        if(minCapacity > oldCapacity){
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            if(newCapacity < minCapacity)
                newCapacity = minCapacity;
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
    }

    public void trimToSize(){
        if(size < elementData.length){
            elementData = (size == 0)?EMPTY_ELEMENT_DATA: Arrays.copyOf(elementData,size);
        }
    }

    public int indexOf(Object o){
        if(o == null)return -1;
        for(int index = 0; index < size; index++){
            if(o.equals(elementData[index])){
                return index;
            }
        }return -1;
    }

    public int lastIndexOf(Object o){
        if(o == null) return -1;
        for (int index = size-1; index >= 0; index--){
            if(o.equals(elementData[index])){
                return index;
            }
        }
        return -1;
    }

    @SuppressWarnings("unchecked")
    public E get(int index){
        return (E)elementData[index];
    }

    @Override
    public HListIterator<E> listIterator() {
        return new HArrayListIterator();
    }

    @Override
    public void add(E e) {
        if(e == null)return ;
        ensureCapacity(size + 1);
        elementData[size++] = e;
    }

    public void add(int index, E e){
        if(e == null)return ;
        if(checkIndex(index)){
            ensureCapacity(size + 1);
            System.arraycopy(elementData, index, elementData, index + 1,size - index);
            elementData[index] = e;
            size++;
        }
    }

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

    @Override
    public HIterator<E> iterator() {
        return new HCollectionIterator();
    }

    @Override
    public boolean contain(E e) {
        return indexOf(e) >= 0;
    }

    @Override
    public void remove(E e) {
        if(e == null)return ;
        for(int index = 0; index < size; index++){
            if(e.equals(elementData[index])){
                remove(index);
                return;
            }
        }
    }

    @Override
    public boolean remove(int index) {
        if(!checkIndex(index))return false;
        int number = size - index - 1;
        if(number > 0){
            System.arraycopy(elementData,index+1,elementData,index,number);
        }elementData[--size] = null;
        return true;
    }

    @Override
    public void clear() {
        for (int i = 0; i < size; i++)
            elementData[i] = null;
        size = 0;
    }

    @Override
    public int size() {
        return size;
    }

    public void set(int index, E e){
        boolean bool = checkIndex(index);
        if(bool){
            elementData[index] = e;
        }
    }

    private boolean checkIndex(int index){
        return index >= 0 && index < size;
    }

    private class HCollectionIterator implements HIterator<E>{

        private int cursor;

        HCollectionIterator(){
            cursor = 0;
        }

        @Override
        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        @Override
        public E next() {
            E retVal = (E)elementData[cursor];
            cursor++;
            return retVal;
        }
    }

    private class HArrayListIterator implements HListIterator<E> {

        private int cursor;

        HArrayListIterator(){
            cursor = 0;
        }

        @Override
        public boolean hasPrevious() {
            return false;
        }

        @Override
        public E previous() {
            return null;
        }

        @Override
        public boolean hasNext() {
            return false;
        }

        @Override
        public E next() {
            return null;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章