- ベストアンサー
JavaのNEW配列生成とガベージコレクション解放
- Javaの配列生成では、NEWを使った場合と使わない場合で挙動が異なります。
- NEWを使わないで生成した配列は、メモリ内で直接値が格納されますが、NEWを使って生成した配列はメモリ内に残ります。
- しかし、NEWを使って生成した配列は、ガベージコレクションによって解放されます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>newを使わなくても使っても、メモリ上に配列のインスタンスは生成される。 そのとおりです。 Javaではprimitive型(byte,char,short,int,long,float,double)以外の全ての型(参照型といいます。あらゆる配列もこれに当たります。)の実体は例外なく必ずヒープ(newしたオブジェクトのための領域と思ってください)に確保されます。コード上にはnewはでてこないのですが、Javaコンパイラーは実はこのプログラムを下記のように置き換えています。 int[] k = new int[3] k[0] = 10; k[1] = 20; k[2] = 30;
その他の回答 (2)
- mpro-gram
- ベストアンサー率74% (170/228)
補足の「newで確保された要素」の意味に、{1,2,3} も含まれます。 int[] i = {1,2,3}; これと以下は同じ int[] i = new int[3]; i[0]=1; i[1]=2; i[2]=3; よって、ブロック内で変数宣言すると if(true){ int[] i = {1,2,3}; } ブロックの外で 変数i は呼び出せないが、メモリ上に 配列のインスタンス{1,2,3}は残り続けている。という意味になる。
補足
mpro-gramさん 返答有難うございます。 まとめると newを使わなくても使っても、メモリ上に配列のインスタンスは生成される。 という意味でしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
どのようなプログラムで比較してどう「違う」と書いてあるのか, 正確な文言をお願いします.
補足
Tacosanさん 回答ありがとうございます そのページ(ガベージコレクションの説明ページ)では 特に比較はしていなくて、(質問中の例とは少し違いますが) if (b == true){ int[] i = {1 , 2 , 3}; } の部分についてのガベージコレクション解放の説明と、それに対してNEWの場合の説明があるのみです。 ※int[] hoge = new int {3}; は、別ページに有ったのですがこの質問用に拝借しただけです。 ガベージコレクション解放の説明を詳しく書くと 「ifブロック文を終えた時点で配列変数iはメモリから消滅します。一方、newで確保された要素たちは普通の変数ではありませんので、ブロックが終了しても寿命は消えません。その結果、配列はどの配列変数からもさんしょうされない状態でメモリに残ってしまいます」 と書いてありますです。
お礼
KSOHさん コンパイラーの説明で大筋理解出来ました。ありがとうございました。