手工实现ArrayList

public class ArrayList<E> {
    //大小
    private int size;
    private E[] elements;
    //容量
    private static final int DEFAULT_CAPACITY=10;
    //如果传的容量小于10,容量就是10,更大则使用传进来的
    public ArrayList(int capacity){
        capacity=(capacity<10)?DEFAULT_CAPACITY:capacity;
        elements=(E[])new Object[capacity];
    }
    //默认容量为10
    public ArrayList(){
        this(DEFAULT_CAPACITY);
    }
    public int size(){
        return size;
    }
    //根据size大小判断是不是空
    public boolean isEmplty(){
        return size==0;
    }
    //将每一个元素置为null,并size=0
    public void clear(){
        for(int i=0;i<size;i++){
            elements[i]=null;
        }
        size=0;
    }
    public boolean contains(E element){
        if(indexOf(element)!=-1){
            return true;
        }
        return false;
    }
    public void add(E element){
        add(size,element);
    }
    public E get(int index){
        if(index<0||index>=size){
            throw new IndexOutOfBoundsException("index:"+index+"  Size:"+size);
        }
        return elements[index];
    }
    public E set(int index,E element){
        E i = get(index);
        elements[index]=element;
        return i;
    }
    public void add(int index,E element){
        ensureCapacity(size+1);
        if(index<0||index>size){
            throw new IndexOutOfBoundsException("index:"+index+"  Size:"+size);
        }
        for(int i=size-1;i>=index;i--){
            elements[i+1]=elements[i];
        }
        elements[index]=element;
        size++;
    }
    private void ensureCapacity(int capacity){
        if(elements.length>capacity){
            return;
        }
        //新容量为旧容量的1.5倍
        int newCapacity=capacity+(capacity>>1);
        E[] newElements=(E[]) new Object[newCapacity];
        //数组复制完成扩容
        //System.arraycopy(elements,0,newElements,0,elements.length);
        for(int i=0;i<elements.length;i++){
            newElements[i]=elements[i];
        }
        System.out.println(capacity+"扩容为"+newCapacity);
        elements=newElements;
        System.out.println(elements.length);
    }
    public E remove(int index){
        if(index<0||index>=size){
            throw new IndexOutOfBoundsException("index:"+index+"  Size:"+size);
        }
        E old = get(index);
        for(int i=index+1;i<=size-1;i++){
            elements[i-1]=elements[i];
        }
        elements[size-1]=null;
        size--;
        return old;
    }
    public int indexOf(E element){
        if(element==null){
            for(int i=0;i<size;i++){
                if (elements[i]==null){
                    return i;
                }
            }
        }else{
            for (int i=0;i<size;i++){
                //比较的是内容是否相等,调用equals方法,而不是用==,当element==null时,为防止报空指针异常,需单独处理
                if(element.equals(elements[i])){
                    return i;
                }
            }
        }
        return -1;
    }

    @Override
    public String toString() {
        StringBuilder sb=new StringBuilder();
        sb.append("size=").append(size).append(", ").append("[");
        for(int i=0;i<size;i++){
            if(i!=0){
                sb.append(", ");
            }
            sb.append(elements[i]);
        }
        sb.append("]");
        return sb.toString();
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("Dog------finalize");
    }
}

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读