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