【以数组实现ArrayList】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

数据结构里,ArrayList是以数组为基础实现的。以扩容,创建新数组的方法来实现数组添加功能。

一、pandas是什么?

代码如下(示例):

package com.lezijie.collection.list;

/**
 * 需求:
 *        1:存储任意类型 通过泛型搞定
 *        2:存储数据的大小交由用户指定 或者自己指定一个合适的大小
 */
public class ArrayList<E> {

    private E[] elementsData; // 实际存储元素的容器
    private static final int INIT_CAPACITY = 10; // 指定默认情况下数组的初始长度为10
    private int size; // 维护当前数组中的待添加的索引位置 维护当前数组的元素个数
    private int capacity; // 维护当前数组中的最大存储容量


    /**
     * 空构造器 创建一个指定长度的数组对象
     */
    public ArrayList(){
        this(INIT_CAPACITY);
    }

    /**
     * 创建一个带参构造器 创建用户指定长度的数组对象
     * @param capacity 用户指定数组长度
     */
    public ArrayList(int capacity){
        // 初始化存储数据的数组对象
        this.elementsData = (E[]) new Object[capacity];
        this.capacity = capacity;
    }

    /**
     * 添加元素到指定的索引位置上
     * @param e
     * @param index
     */
    public void add(E e,int index){
        // 判定当前index的合法性
        checkIndex(index);

        // 判定当前数组是否满了
        if (size==capacity)
            grow(capacity*2);

        // 循环挪动元素
        for (int i = size;i>index;i--)
            elementsData[i] = elementsData[i-1];
        //添加元素到index
        elementsData[index] = e;
        //维护size
        size++;
    }

    /**
     * 数组扩容的方法
     * @param newCapacity
     */
    private void grow(int newCapacity) {
        //定义一个新的数组
        E[] newElemenetData = (E[]) new Object[newCapacity];
        // 进行数组拷贝
        for (int i=0;i<size;i++)
            newElemenetData[i] = elementsData[i];
        //将对象中的elementsData重新进行指向
        this.elementsData =  newElemenetData;
        //维护capacity的值
        this.capacity = newCapacity;
    }

    /**
     * 添加首元素
     * @param e
     */
    public void addFirst(E e){
        add(e,0);
    }


    /**
     * 删除指定索引位置上的元素
     * @param index 删除索引
     * @return 待删除位置的元素
     */
    public E remove(int index){
        // 判定索引是否有效
        checkIndex(index);
        // 获取待删除的元素
        E ret = elementsData[index];
        // 循环挪动元素
        for (int i = index;i<size-1;i++)
            elementsData[i] = elementsData[i+1];
        // 维护索引
        size--;
        // 将size指向的元素置为null
        elementsData[size] = null;
        // 是否缩容
        if (size==capacity/4&&capacity/2!=0)
            grow(capacity/2);

        return ret;
    }

    /**
     * 删除指定元素
     * @param e
     */
    public void remove(Object e){
        // 查找该元素是否存在
        int index = indexOf((E)e);
        if (index==-1)
            throw new IllegalArgumentException("element e:"+e+" is not found");
        remove(index);
    }

    /**
     * 删除首元素
     * @return
     */
    public E removeFirst(){
        return remove(0);
    }

    /**
     * 删除尾元素
     * @return
     */
    public E removeLast(){
       return remove(size-1);
    }


    /**
     * 查找元素是否存在 如果存在返回对应的索引 如果不存在返回-1
     * @param e
     * @return
     */
    public int indexOf(E e) {
        if (e==null){
            for (int i = 0;i<size;i++){
                if (elementsData[i]==null)
                    return i;
            }
        }else{
            for (int i = 0;i<size;i++){
                if (e.equals(elementsData[i]))
                    return i;
            }
        }
        return -1;
    }

    /**
     * 查询元素是否包含在集合中
     * @param e
     * @return
     */
    public boolean contains(E e){
        return indexOf(e) != -1;
    }

    /**
     * 查询指定位置的元素
     * @param index
     * @return
     */
    public E get(int index){
        checkIndex(index);
        return elementsData[index];
    }

    /**
     * 修改指定位置上的元素
     * @param index
     * @param e
     */
    public void set(int index,E e){
        checkIndex(index);
        elementsData[index] = e;
    }

    /**
     *  判定index的合法性
     * @param index
     */
    private void checkIndex(int index) {
        if (index<0 || index>size)
            throw new IllegalArgumentException("index out of bounds index:"+index);
    }

    /**
     * 添加元素E到当前的集合中的末尾
     * @param e
     */
    public void add(E e){
        addLast(e);
    }

    /**
     *  添加元素到当前集合中的末尾
     * @param e
     */
    public void addLast(E e){
        if (size==capacity)
            grow(capacity*2);
        elementsData[size] = e;// 将元素e添加到size指向的索引位置
        size++; //维护一下size即可
    }


    /**
     * 查看当前集合是否为空
     * @return
     */
    public boolean isEmpty(){
        return size == 0;
    }

    /**
     * 查询当前集合中的元素个数
     * @return
     */
    public int getSize(){
        return size;
    }

    public String toString(){
        StringBuilder retStr = new StringBuilder();
        retStr.append("size:"+size+" [");
        for (int i = 0;i<size;++i){
            retStr.append(elementsData[i]);
            if (i!=size-1)
                retStr.append(",");
        }
        retStr.append("] capacity:"+capacity);

        return retStr.toString();
    }
}

总结

就是这样,都有注释,大家看代码,一起敲就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值