2016-11-03 11 views
0

System.arraycopyの仕組みを正確に理解できません。私は "[0]を配置するcopyArrする[0]から始まるARRからコピー1要素" のようにそれを理解System.arraycopyはArrayIndexOutOfBoundsExceptionをスローしません

String[] arr = {"a"}; 
String[] copyArr = new String[10]; 
System.arraycopy(arr, 0, copyArr, 0, 1); 
System.out.println(Arrays.toString(copy)); 

:簡単な例を持っています。そしてこれは大丈夫です。 arr.lengthが1であり、我々が呼び出すことができる唯一のインデックスは[0]私はそれがは、ArrayIndexOutOfBoundsExceptionがスローされますが、そうでないことが期待されているので

String[] arr = {"a"}; 
String[] copyArr = new String[10]; 
System.arraycopy(arr, 1, copyArr, 0, 0); 
System.out.println(Arrays.toString(copy)); 

:今、私はそれを変更します。

したがって、以下の2行の違いは何ですか?また、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 +長さ> src.lengthためのドキュメントに記述されています)。

+0

なので?それともそれを知りたいのですか? – Tunaki

答えて

2

src[1]には長さ0の配列があります。この配列はコピーできます。 src[2]には長さゼロの配列がないため、例外がスローされます。

は(サブアレイのサイズが示されている)が含まれているサイズ3、及びサブアレイのアレイを想像:

[ 0 ][ 1 ][ 2 ] 
[ -----3------] 
    [----2---] 
      [-1-] 
      [] 

同上アレイの開始、およびインデックス間におけるすべての位置について。ここで

+1

あなたの答えを少し精巧にすることができれば嬉しいです – sanbhat

+0

ありがとう、私はちょうどarraycopyの実装にこの 'if(length == 0){return; } '@FaigBによってリンクされている[question](http://stackoverflow.com/questions/12594046/java-native-method-source-code)にあり、内部的にどのように実装されているかを示しています – swch

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()); 
} 
関連する問題