ArrayList数组列表内部增删改查源码分析

31 篇文章 4 订阅
21 篇文章 1 订阅

对源码中的注释进行翻译解读,源码注释需查阅源码

一、ArrayList

1.增

将指定的元素追加到此列表的末尾

参数e将要添加到此列表的元素
返回booleanas specified by {@link Collection#add}
public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

 将指定的元素插入到此列表中的指定位置。将当前位置的元素(如果有的话)和随后的元素向右移动(给它们的下标加1)。

参数
参数
index

将要添加到此列表的元素的索引

element将要插入的元素
抛出IndexOutOfBoundsException {@inheritDoc}
 public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }

这里研究一个方法java.lang.System.arraycopy()方法,方法注释翻译如下:

从指定的位置开始,将数组从指定的源数组复制到目标数组的指定位置。将数组组件的子序列从src引用的源数组复制到dest引用的目标数组。复制的组件数量等于参数length。将源数组中位置为srcPos到srcPos+length-1的组件分别复制到目标阵列位置为destPos到destPos+length-1的组件。
如果src和dest参数引用同一个数组对象,然后执行复制,如果组件位置通过srcPos srcPos +长度是1第一次被复制到一个临时数组长度为组件,然后临时数组的内容复制到职位destPos通过destPos +目标数组的长度是1。
如果dest为空,则抛出NullPointerException。
如果src为空,则抛出NullPointerException,并且不修改目标数组。
另外,如果以下任一项为真,就会抛出一个ArrayStoreException并且不修改目标:

  • src参数引用的对象不是数组。
  • dest参数引用的对象不是数组。
  • src参数和dest参数指的是组件类型为不同基元类型的数组。
  • src参数指向一个具有基元组件类型的数组,dest参数指向一个具有引用组件类型的数组。
  • src参数指向一个具有引用组件类型的数组,dest参数指向一个具有基元组件类型的数组。

另外,如果以下任一项为真,则抛出IndexOutOfBoundsException异常,且不修改目标:

  • srcPos参数为负值。
  • destPos是负的。
  • length参数是负的。
  • srcPos+length大于src。Length,源数组的长度。
  • destPos+length大于目标数组的长度dest.length。

另外,如果源数组中从位置srcPos到srcPos+length-1的任何实际组件不能通过赋值转换转换为目标数组的组件类型,则会抛出ArrayStoreException。在本例中,设k是小于长度的最小的非负整数,使src[srcPos+k]不能转换为目标数组的组件类型;当抛出异常时,从位置srcPos到srcPos+k-1的源数组组件将已经通过destPos+k-1复制到目标数组位置destPos,并且目标数组的其他位置将不会被修改。(由于已经列出的限制,这一段实际上只适用于两个数组都具有引用类型的组件类型的情况。)

参数src源数组
srcPos源数组的起始位置
dest目标数组
destPos目标数据的起始位置
length要复制的数组元素的数量
抛出IndexOutOfBoundsException如果复制会导致访问数组边界外的数据
ArrayStoreException如果src数组中的元素因为类型不匹配而不能存储到dest数组中
NullPointerExceptionsrc或dest为空
    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

 2.删

移除该列表中指定位置的元素。

将所有后续的元素向左移动(从它们的指数中减去1)

参数index要删除的元素的索引
返回从列表中删除的元素
抛出@throws IndexOutOfBoundsException {@inheritDoc}

 

public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

如果指定元素存在,则从该列表中删除该元素的第一个匹配项。如果列表中不包含该元素,则该元素不变。更正式地说,删除索引i最低的元素,这样(o==null ?Get (i)==null: o.equals(Get (i)))(如果存在这样的元素)。如果该列表包含指定的元素,则返回true(或者,如果该列表因调用而发生更改,则返回true)。

参数o元素,如果存在,则从列表中删除
返回如果此列表包含指定的元素,则为true
public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }

3. 改

将此列表中指定位置的元素替换为指定的元素。

参数Index要替换的元素的索引
element存储在指定位置的元素
返回先前位于指定位置的元素
抛出IndexOutOfBoundsException
public E set(int index, E element) {
        rangeCheck(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }

4. 查

返回列表中指定位置的元素。

参数index要返回的元素的索引
返回E位于列表中指定位置的元素
抛出IndexOutOfBoundsException
public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肆〇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值