2 D配列にメモリを割り当てる


2 D配列はメモリにどのように割り当てられますか?


の見込みがある


コード1
int[][] arr=new arr[3][2];
通常の2 D配列(コード1など)を宣言すると、参照変数によって管理される2 D連続メモリ割り当てとみなされる場合があります.

実際


しかし、実際には、2 D配列は、連続メモリを割り当てた個別の静的データ構造ではなく、1次元配列と各1次元配列を参照する配列から構成されています.
コード2
int[][] arr=new int[3][];
arr[0] = new int[3]
arr[1] = new int[2]
arr[2] = new int[1]

「コード2」と宣言すると、上記のメモリ割り当てが発生します.
サンプルコードと出力結果で詳細なチェックを行うことができます.
System.out.println("-- 참조 배열만 선언 --");

int[][] arr=new int[3][];
System.out.println("arr : "+arr); // 타입과 참조하는 배열의 시작 메모리 주소 확인 가능
// [[I@ => int배열에 대한 배열
System.out.println("arr[0] :" +arr[0]+", arr[1] : "+arr[1]+", arr[2] : "+arr[2]);
// 각 원소가 참조할 int배열이 할당되지 않았으므로 null 출력
System.out.println();

arr[0]=new int[3];
arr[1]=new int[2];
arr[2]=new int[1];

System.out.println("-- 각 참조에 int 배열 할당 후 --");
System.out.println("arr[0] :" +arr[0]+", arr[1] : "+arr[1]+", arr[2] : "+arr[2]); // 각 참조의 타입과 가리키는 배열의 시작 메모리 주소 출력
System.out.println("arr[0] class :" +arr[0].getClass()+", arr[1] class : "+arr[1].getClass()+", arr[2] class : "+arr[2].getClass());
System.out.println();

// 새로운 1차원 배열을 메모리에 할당하여 arr[0]의 참조를 변경.
arr[0]=new int[10];

//메모리 주소가 바뀐것 확인
System.out.println("-- arr[0] 이 가리키는 참조 메모리 주소 바뀜 --");
System.out.println("arr[0] :" +arr[0]);
しゅつりょく
--値を格納する1次元配列を宣言して出力--
arr : [[I@7e0ea639
arr[0] :null, arr[1] : null, arr[2] : null
--1次元アレイごとにメモリを割り当て、メモリアドレスを出力します.
arr[0] :[I@2c6a3f77, arr[1] : [I@246ae04d, arr[2] : [I@62043840
arr[0] class :class [I, arr[1] class : class [I, arr[2] class : class [I
--arr[0]が示す1次元配列を再割り当てした後、参照メモリアドレスを置き換えます.
arr[0] :[I@5315b42e