これは、Java配列を宣言するための通常の方法です。
int[] arr = new int[100];
ただし、この配列はヒープスペースを使用しています。C ++のようなスタックスペースを使用して配列を宣言する方法はありますか?
Arrays are objects
プリミティブ型またはオブジェクト型のどちらを保持するかに関係なく、他のオブジェクトと同様に、allocated space on the heap.
But then from Java 6u23
バージョンEscape Analysis
は、によって存在するようになりましたdefault activated in Java 7
。
Escape Analysis is about the scope of the object
、when an object is defined inside a method scope rather than a class scope
、その後、JVM は、このオブジェクトがこの制限されたメソッド スコープから逃れることができないことを認識し、それにさまざまな最適化を適用します.. 定数の折りたたみなど
Then it can also allocate the object which is defined in the method scope,
on the Thread's Stack, which is accessing the method.
一言で言えば、いいえ。
スタックに格納される変数は、プリミティブとオブジェクト参照のみです。この例では、arr
参照はスタックに格納されていますが、ヒープ上にあるデータを参照しています。
メモリがクリーンアップされていることを確認したいという理由でC++からこの質問をしている場合は、ガベージコレクションについて読んでください。つまり、Javaは、スタック上のメモリだけでなく、ヒープ内のメモリも自動的にクリーンアップします。
配列は動的に割り当てられるため、ヒープに配置されます。
つまり、これを行うとどうなりますか?
int[] arr = new int[4];
arr = new int[5];
最初の割り当てがスタックで行われた場合、どのようにガベージコレクションを行いますか?参照arr
はスタックに格納されますが、データの実際の配列はヒープ上にある必要があります。