源码阅读:简单实现ArrayList中的主要方法

ArrayList就是传说中的动态数组,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素、灵活的设置数组的大小

  • 两个字段:数组容器与元素的个数size
   /**
     * 字段:数组作为容器,与尺寸
     */
    Object[] elementData;
    int size;//区分数组中的属性length(容器的容量)
  • 构造方法:(指定元素数组初始化容量 + 一个默认的10个容量大小)
    public ArrayListImpl(int initialSize){
        if (initialSize < 0){
            throw new IllegalArgumentException("LIst容量不够");

        }
        this.elementData =new Object[initialSize];
    }

    public ArrayListImpl(){
        this(10);//默认调用容量为10的构造方法
    }
  • 添加元素:之前需要检查容量,调用ensureCapacity,如果不够的话容量大小应该增加
   public boolean add(Object element){
        ensureCapacity(size + 1);//至少扩充容量的1个
        elementData[size++] = element;
        return true;
    }

    /**
     * 确定容量:取max(指定的值minCapacity,1.5倍原来容量+1);并重新赋值
     */
    public void ensureCapacity(int minCapacity){//默认是为  size + 1:size指的是其中数据个数
        int oldCapacity = elementData.length;//数组的长度
        if (oldCapacity < minCapacity){//原来的空间不够了
            int newlength = (oldCapacity * 3)/2 + 1;
            int newCapacity = Math.max(minCapacity,newlength);
            elementData = Arrays.copyOf(elementData,newCapacity);//复制数组
        }
    }
  • 指定index进行添加:[ index,后面的 ] 往后移动一个
 public boolean add(int index, Object element){
        if (index < 0 || index > size ){//如果为空或者已经越界了就抛出异常
            throw new ArrayIndexOutOfBoundsException("数组索引错误index:"+ index);
        }
        ensureCapacity(size);
        System.arraycopy(elementData, index, elementData, index + 1,
                size - index);//往后偏移一个
        elementData[index] = element;
        size++;
        return true;
    }
  • 获取指定的元素:之前需要检查index时候越界
/**
     * 获取元素之前需要检查是否越界等
     */

    public Object get(int index){
        rangeCheck(index);
        return elementData[index];
    }

    public void rangeCheck(int index){
        if (index > size){
            throw new ArrayIndexOutOfBoundsException("您查找的元素越界了");
        }
    }
  • 删除元素:把当前到最后的元素进行往前移动一位,并删除让垃圾回收进行回收
 public Object remove(int index){
        rangeCheck(index);
        Object oldElement = elementData[index];//临时保存起来
        int numMoved = size - index - 1;//长度
        if (numMoved > 0){
            System.arraycopy(elementData,index+1,elementData,index,numMoved);
        }
        elementData[--size] =null;//垃圾回收机制开始工作
        return oldElement;
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值