次の2つの宣言に違いはありますか?
int arr[] = new int [5];
そして
int arr1[] = {1,2,3,4,5};
arr1
スタックまたはヒープで宣言されていますか?
一方にはすべてゼロがあり、もう一方には[1..5]が含まれているという明らかな違いがあります。
しかし、それが唯一の違いです。どちらも5要素のint配列で、どちらも同じ方法で割り当てられます。 new
なしで中括弧で宣言することは、単なる構文上の便利さです。
この形式は、配列が宣言されている場合にのみ使用できることに注意してください。
int[] blah = {}
だがしかし
int[] blah;
blah = {};
または
return {};
オブジェクト(配列はオブジェクト)はヒープに割り当てられます。
最初の行は、ヒープに4つの要素を保持する配列オブジェクトである1つの新しいオブジェクトを配置します。各要素には、デフォルト値0のintが含まれます。
2番目も同じことを行いますが、デフォルト値以外で初期化します。さらに詳しく説明すると、この単一行は4つのことを行います。
プリミティブの代わりにオブジェクトの配列を使用する場合:
MyObject[] myArray = new MyObject[3];
次に、ヒープ上にMyObject型の3つのnull参照を持つ1つの配列オブジェクトがありますが、MyObjectオブジェクトはありません。次のステップは、いくつかのMyObjectオブジェクトを作成し、それらをmyArrayが参照する配列内のインデックス位置に割り当てることです。
myArray[0]=new MyObject();
myArray[1]=new MyObject();
myArray[2]=new MyObject();
結論として、配列には、構築時に常にサイズを指定する必要があります。 JVMは、新しい配列オブジェクトのヒープに適切なスペースを割り当てるためのサイズを必要とします。
new int [5]
は、assignmentと初期化 の両方に使用できます=、ただし{1, 2}
は初期化を伴う宣言としてのみ使用できます。 (ご了承ください new int[] {1, 2}
は、assignmentとinitialization)の両方としても使用できます。
new int [5]
はすべてのエントリをゼロに設定しますが、{1, 2}
およびnew int[] {1, 2}
セット1
および2
それぞれのエントリ。
両方ともヒープ上 、オブジェクト参照を保存できます。
int arr[] = new int [5];
// arr: object reference to the array
または
int arr[] = {1, 2, 3, 4, 5};
// arr: object reference to the array
参考資料:
私は他の答えに同意します、あなたの配列がヒープに割り当てられることが最も多いです(2つの宣言のどちらを使用しても)。ただし、 Can Javaスタックにリストを割り当てることができますか? 、「特別な場合、Java virtualマシンはエスケープ分析を実行し、オブジェクトをスタックに割り当てることを決定するかもしれません。」これは真実だと思います。したがって、あなたの質問に対する答えは次のとおりです。通常はヒープに依存します。
Objects
はheap
にあります。 Arrays
はobject type
in Javaプログラミング言語。公式ドキュメント ここ