0

配列宣言があるとします。

int [] a = new int[3]; 

実行時に配列を明示的に作成する必要がある理由は、コンパイル時に配列用に予約するスペースが分からないためであるという本を読んでいます。したがって、上記の場合、基礎となる Java プラットフォームの int の 3 倍のサイズを予約する必要があることを知りませんか?

4

5 に答える 5

5

したがって、上記の場合、基礎となる Java プラットフォームの int の 3 倍のサイズを予約する必要があることを知りませんか?

配列はクラス参照と長さを持つオブジェクトであるため、実際にはそれよりもわずかに多くなります。

しかし、はい、この場合、たまたまサイズが事前にわかっています。ただし、Java では次のように書くこともできます。

int[] a = new int[getLengthFromMethod()];

...その場合、いいえ、メモリの量はコンパイル時にわかりません。この柔軟性により、コンパイル時にサイズを知る必要がある場合よりも、配列の操作がかなり簡単になります。ArrayList(たとえば、別の方法で機能させようとすることを想像してみてください。)

ただし、メモリ割り当ては一般に Java では非常に動的であることに注意してください。事実上、実際には事前にわかっているスタック フレームのサイズのみであり、相対的な意味でのみです (参照のサイズはプラットフォーム間で異なる可能性があるため)。すべての1オブジェクトがヒープに割り当てられ、参照を使用してそれらを追跡します。


1さて、エスケープ解析を実行した後にインラインで割り当てることができるスマート JVM は別として。

于 2012-08-05T23:12:34.547 に答える
2

その本では、おそらく、コンパイル時に配列の大きさがわからないシナリオがあると言っています (例: ユーザーに一連の数値を要求するとき、ユーザーが挿入する数値がわからない場合) )。

あなたの例 ( int [] a = new int[3]) では、コンパイル時に配列のサイズを明らかに知っています。3です。

于 2012-08-05T23:12:06.507 に答える
0

あなたの場合、配列のサイズは3です。角括弧内の数字はsizeです。www.codejava.co.ukの配列に関する今週のチュートリアルをチェックしてください。

于 2012-08-05T23:29:57.387 に答える
0

はい。あなたの正しい。

3 * sizeOf(int) + array overhead.

その量のメモリを予約してから、最初の位置へのポインターを変数 a に渡します。次に、格納されているものの場所とサイズに基づいて、配列にインデックスを付ける方法を理解できます。

于 2012-08-05T23:12:20.863 に答える
-2

あなたが読んでいる本は本当に Java に関するものですか?

C/C++ とは異なり、Java にはそのようなジレンマはありません。コンパイル時に配列のサイズがわかっている場合でも、配列は常に実行時に割り当てられます。

于 2012-08-05T23:12:46.730 に答える