我不完全了解System.arraycopy的工作原理。举个简单的例子:
String[] arr = {"a"};
String[] copyArr = new String[10];
System.arraycopy(arr, 0, copyArr, 0, 1);
System.out.println(Arrays.toString(copy));
我理解它就像“从[0]开始到复制Arr到位置[0]的复制1元素”。这没关系。现在我将其更改为:
String[] arr = {"a"};
String[] copyArr = new String[10];
System.arraycopy(arr, 1, copyArr, 0, 0);
System.out.println(Arrays.toString(copy));
由于arr.length是1并且我们可以调用的唯一索引是[0],我预计它将抛出ArrayIndexOutOfBoundsException,但它不会。
所以问题是下面这两行之间的区别是什么,如果src中[1]处没有元素(因为它的长度是1),第一个可行的原因是什么,这是本机方法所以它是如何的在内部实施?
System.arraycopy(src, 1, dest, 0, 0);
System.arraycopy(src, 0, dest, 0, 0);
当我们将其更改为:
时,有趣的是什么System.arraycopy(src, 2, dest, 0, 0);
有ArrayIndexOutOfBoundsException(这个案例在文档中描述,因为srcPos + length> src.length)。
答案 0 :(得分:2)
src[1]
处有一个零长度数组,您可以“复制”。 <{1}}没有零长度数组,因此会抛出异常。
想象一个大小为3的数组,以及它包含的子数组(显示的子数组大小):
src[2]
Ditto表示数组的开头,以及索引之间的每个位置。
答案 1 :(得分:1)
您在topic
从代码中可以清楚地看出:
// Check if the ranges are valid
if ( (((unsigned int) length + (unsigned int) src_pos) > (unsigned int) s->length())
|| (((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length()) ) {
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
}