web-dev-qa-db-ja.com

Javaで 'new'キーワードを使用せずに配列を宣言する

次の2つの宣言に違いはありますか?

int arr[] = new int [5];

そして

int arr1[] = {1,2,3,4,5};

arr1スタックまたはヒープで宣言されていますか?

24

一方にはすべてゼロがあり、もう一方には[1..5]が含まれているという明らかな違いがあります。

しかし、それが唯一の違いです。どちらも5要素のint配列で、どちらも同じ方法で割り当てられます。 newなしで中括弧で宣言することは、単なる構文上の便利さです。

この形式は、配列が宣言されている場合にのみ使用できることに注意してください。

int[] blah = {}

だがしかし

int[] blah;
blah = {};

または

return {};

オブジェクト(配列はオブジェクト)はヒープに割り当てられます。

32
Andy Turner

最初の行は、ヒープに4つの要素を保持する配列オブジェクトである1つの新しいオブジェクトを配置します。各要素には、デフォルト値0のintが含まれます。

2番目も同じことを行いますが、デフォルト値以外で初期化します。さらに詳しく説明すると、この単一行は4つのことを行います。

  • Arr1という名前のint配列参照変数を宣言します
  • 長さ5(5要素)のint配列を作成します。
  • 配列の要素に値1、2、3、4、5を入力します
  • 参照変数arr1に新しい配列オブジェクトを割り当てます

プリミティブの代わりにオブジェクトの配列を使用する場合:

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は、新しい配列オブジェクトのヒープに適切なスペースを割り当てるためのサイズを必要とします。

8
debus
  • new int [5]は、assignment初期化 の両方に使用できます=、ただし{1, 2}初期化を伴う宣言としてのみ使用できます。 (ご了承ください new int[] {1, 2}は、assignmentinitialization)の両方としても使用できます。

  • 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
    

参考資料:

5
frogatto

私は他の答えに同意します、あなたの配列がヒープに割り当てられることが最も多いです(2つの宣言のどちらを使用しても)。ただし、 Can Javaスタックにリストを割り当てることができますか? 、「特別な場合、Java virtualマシンはエスケープ分析を実行し、オブジェクトをスタックに割り当てることを決定するかもしれません。」これは真実だと思います。したがって、あなたの質問に対する答えは次のとおりです。通常はヒープに依存します。

4
Ole V.V.

Objectsheapにあります。 Arraysobject type in Javaプログラミング言語。公式ドキュメント ここ

3
Pravat Panda