欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ArrayList类的实现

程序员文章站 2022-04-18 18:36:57
...
首先来说明实现细节:
MyArrayList将保持基础数组,数组的容量,以及存储在MyArrayList中的当前项数。
MyArrayList将提供一种机制来改变基础数组的容量,通过获得一个新的数组,并将老数组拷贝到新数组中来改变数组容量。
MyArrayList将提供get、set的实现
MyArrayList将提供基本的例程,如size、isEmpty和clear,以及remove和add的两个版本,如果数组的大小和容量相同,将增加容量。

MyArrayList将提供一个实现Iterator接口的类。

import java.util.Iterator;

public class MyArrayList<T> implements Iterable<T>{
    private static final int DEFAULT_CAPACITY = 10;//初始容量
    private int theSize;//大小
    private T [] theItems;

    public MyArrayList(){
        doClear();
    }

    public void clear(){
        doClear();
    }

    public int size(){
        return theSize;
    }

    public void doClear(){
        theSize = 0;
        ensureCapacity(DEFAULT_CAPACITY);
    }

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

    public T get(int idx){
        if(idx < 0|| idx >= size())//参数非法
            throw new ArrayIndexOutOfBoundsException();
        return theItems[idx];
    }

    public T set(int idx,T newVal){
        if(idx < 0 || idx >= size())//参数非法
            throw new ArrayIndexOutOfBoundsException();
        T old = theItems[idx];
        theItems[idx] = newVal;
        return old;
    }

    public void ensureCapacity(int newCapacity){//保证容量
        if(newCapacity < DEFAULT_CAPACITY){
            return;
        }
        T [] old = theItems;
        theItems = (T []) new Object[newCapacity];
        for(int i = 0;i < size();i ++){
            theItems[i] = old[i];
        }
    }

    public boolean add(T x){
        add(size(),x);
        return true;
    }

    public void add(int idx,T x){
        if(theItems.length == size()){//扩容
            ensureCapacity(2*size()+1);
        }
        for(int i = theSize;i > idx;i --){//后移
            theItems[i] = theItems[i-1];
        }
        theItems[idx] = x;
        theSize++;
    }

    public T remove(int idx){
        if(idx < 0 || idx >= size()){
            throw new ArrayIndexOutOfBoundsException();
        }
        T removedItem = theItems[idx];
        for(int i = idx;i < size()-1;i++){
            theItems[i] = theItems[i+1];
        }
        theSize--;
        return removedItem;
    }

    @Override
    public Iterator<T> iterator() {//返回迭代器
        return new ArrayListIterator();
    }

    private class ArrayListIterator<T> implements Iterator<T> {//实现迭代器
        private int current = 0;
        public boolean hasNext(){
            return current < size();
        }

        public T next(){
            if(!hasNext()){
                throw new java.util.NoSuchElementException();
            }
            return (T) theItems[current++];
        }
        public void remove(){
            MyArrayList.this.remove(--current);
        }
    }
}

下面是实际测试的代码:

MyArrayList<Integer> myList = new MyArrayList<Integer>();
        System.out.println("空吗?"+myList.isEmpty());
        for(int i = 0;i < 15;i ++){
            myList.add(i);
        }
        System.out.println("大小:"+myList.size());
        System.out.println("空吗?"+myList.isEmpty());
        System.out.println("移除倒数第二个元素:"+myList.remove(13));
        System.out.println("使用迭代器:");
        Iterator iterator = myList.iterator();
        while(iterator.hasNext()){
            System.out.print(iterator.next()+" ");
            iterator.remove();
        }
        System.out.println("\n清空后大小:"+myList.size());
测试结果:

空吗?true
大小:15
空吗?false
移除倒数第二个元素:13
使用迭代器:
0 1 2 3 4 5 6 7 8 9 10 11 12 14 
清空后大小:0