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
Reference
この問題について(2 D配列にメモリを割り当てる), 我々は、より多くの情報をここで見つけました https://velog.io/@jerry92/2차원-배열의-메모리-할당テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol