Java ArrayList的工作原理&x27;什么方法?

Java ArrayList的工作原理&x27;什么方法?,java,arraylist,Java,Arraylist,ArrayList的移除器工作异常。检查下面的示例代码,我反向输入。我原以为名单被反向删除了 例:3到1表示三个元素被移除(第三、第二和第一) 但是,输出完全把我弄糊涂了。想知道它是如何工作的吗 从JavaDoc中,我找到了下面的语句。如果toIndexsize()| |到索引< fromIndex) import java.util.*; 公共类TestRemoveRange扩展了ArrayList{ 公共静态void main(字符串arg[]){ TestRemoveAnge列表=新的Te

ArrayList的移除器工作异常。检查下面的示例代码,我反向输入。我原以为名单被反向删除了

例:3到1表示三个元素被移除(第三、第二和第一)

但是,输出完全把我弄糊涂了。想知道它是如何工作的吗

从JavaDoc中,我找到了下面的语句。如果toIndex IndexOutOfBoundsException-如果fromIndex或toIndex超出范围 (从索引<0 | |从索引>=size()| |到索引>size()| |到索引< fromIndex

import java.util.*;
公共类TestRemoveRange扩展了ArrayList{
公共静态void main(字符串arg[]){
TestRemoveAnge列表=新的TestRemoveAnge();
列表。添加(“a”);
列表。添加(“b”);
列表。添加(“c”);
列表。添加(“d”);
列表。添加(“e”);
System.out.println(“删除前:+列表”);
清单1.1(3,1);
System.out.println(“删除(3,1)后:”+list);//[a,b,c,b,c,d,e]
}     
}

查看实际的源代码可能有助于澄清您的问题:

Java 8中

protected void removeRange(int fromIndex, int toIndex) {
    modCount++;
    int numMoved = size - toIndex;
    System.arraycopy(elementData, toIndex, elementData, fromIndex,
                     numMoved);

    // clear to let GC do its work
    int newSize = size - (toIndex-fromIndex);
    for (int i = newSize; i < size; i++) {
        elementData[i] = null;
    }
    size = newSize;
}
正如您在上面的代码片段中所看到的,这两种实现都用于删除列表中的项目。但只有在Java 9之后,才会有一个检查抛出
IndexOutOfBoundsException
if
fromfindex>到index

因为在不同的平台上,
System.arraycopy()
可能不同。根据标准,其行为应如下所示:

将数组从指定的源数组(从指定位置开始)复制到目标数组的指定位置。[……]

如果
src
dest
参数引用相同的数组对象,然后执行复制,就好像位置
srcPos
srcPos+length-1
的组件首先被复制到具有
length
组件的临时数组中,然后临时数组的内容被复制到目标的位置
destPos
destPos+length-1
数组

对于
IndexOutOfBoundException
它说:

如果以下任一项为真,将抛出
IndexOutOfBoundsException
,并且不修改目标:

  • srcPos
    参数为负
  • destPos
    参数为负
  • length
    参数为负数
  • srcPos+length
    大于源数组的长度
    src.length
  • destPos+length
    大于目标数组的长度
    dest.length
因此,如果您使用Java8或以下版本运行示例,您可能会得到以下结果:

before remove : [a, b, c, d, e]
after remove (3, 1) : [a, b, c, b, c, d, e]
如果使用Java 9或更高版本运行示例,您将得到以下异常:

before remove : [a, b, c, d, e]
Exception in thread "main" java.lang.IndexOutOfBoundsException: From Index: 3 > To Index: 1
    at java.base/java.util.ArrayList.removeRange(ArrayList.java:769)
    at TestRemoveRange.main(TestRemoveRange.java:16)

无法复制。我在线程“main”java.lang.IndexOutOfBoundsException中得到
异常:从java.base/java.util.ArrayList.removeRange(ArrayList.java:664)的Index:3>到TestRemoveRange.main(TestRemoveRange.java:15)的Index:1
。我的java版本是1.8.0\u 121。我仍然面临这个问题。想知道上面的代码是如何工作的(版本<9)?@sprabhakaran是的,但在不同的平台上可能会有所不同,因为
System.arraycopy()
是本机实现的。我在我的帖子中添加了更多的细节。
before remove : [a, b, c, d, e]
Exception in thread "main" java.lang.IndexOutOfBoundsException: From Index: 3 > To Index: 1
    at java.base/java.util.ArrayList.removeRange(ArrayList.java:769)
    at TestRemoveRange.main(TestRemoveRange.java:16)