首页 新闻 会员 周边 捐助

关于ArrayList源码的问题,大佬快进

0
[已解决问题] 解决于 2018-09-11 12:32

问题是这样的,看下边这段代码
public boolean addAll(int index, Collection<? extends E> c) {
rangeCheckForAdd(index);

    Object[] a = c.toArray();
    int numNew = a.length;
    ensureCapacityInternal(size + numNew);  // Increments modCount

    int numMoved = size - index;
    if (numMoved > 0)
        System.arraycopy(elementData, index, elementData, index + numNew,
                         numMoved);

    System.arraycopy(a, 0, elementData, index, numNew);
    size += numNew;
    return numNew != 0;
}

这个方法一开始先调用了rangeCheckForAdd(index)方法,这个方法内部是这样的

private void rangeCheckForAdd(int index) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

也就是一开始就判断了index与size的大小问题,那么为什么下边这段代码还需要加个大于0的判断呢
int numMoved = size - index;
if (numMoved > 0)
System.arraycopy(elementData, index, elementData, index + numNew,
numMoved);

ArrayList的增加数据中,只有这个增加方法增加了这个判断语句

PottyHarry的主页 PottyHarry | 菜鸟二级 | 园豆:302
提问于:2018-09-11 08:48
< >
分享
最佳答案
1

因为size可能会等于index

奖励园豆:5
让我发会呆 | 老鸟四级 |园豆:2929 | 2018-09-11 11:26

确实是这样,如果我在那个方法里把index>size改成index>=size,那么是不是可以不加这个判断语句了

PottyHarry | 园豆:302 (菜鸟二级) | 2018-09-11 11:49

@PottyHarry: index=size是合理的需求,你不能抛出异常的。当index=size时,就是在原list后面追加。

让我发会呆 | 园豆:2929 (老鸟四级) | 2018-09-11 12:22

@让我发会呆: OK,我明白你的意思了,多谢指导。

PottyHarry | 园豆:302 (菜鸟二级) | 2018-09-11 12:31
其他回答(1)
1

如果不大于0 ,那就没有添加元素的必要了~~后面的复制数组代码也就不用执行了啊

队长给我球。 | 园豆:324 (菜鸟二级) | 2018-09-11 11:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册