2017-01-30 7 views
0

新しいArrayList()を使用すると、メモリが連続して割り当てられますか? list.add(e)を10回呼び出すと、すべての要素が連続してメモリに格納されますか、またはランダムにメモリに格納されますか?は、arraylistのために連続して割り当てられたメモリですか?

ありがとうございました。

+1

なぜ気になりますか?もしあなたが知っていなければ、これを読んでください:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/ArrayList.java?av=f GrepCodeはあなたですこのタイプの質問の友人。 –

+1

まあ、 'ArrayList'はJava配列に基づいています。また、Java配列はメモリ内で連続しているとは限りません。しかし、なぜそれはとにかく問題になるのですか? –

+1

私は答えがOS特有のものだと思っていただろう –

答えて

2

まず、ArrayListの仕組みを理解する必要があります。内部オブジェクト配列elementDataに実際のストレージへの「参照」または「ポインタ」を格納します。この参照配列は連続していても構いませんが、JVM固有のものです。実際に追加されるオブジェクトはヒープに格納され、JVMに固有のものですが、ほぼ確実に連続しないことになります。

elementData[0] ===> object 1 
elementData[1] ===> object 2 
elementData[2] ===> object 3 
... 

二、あなたは()を複数回追加呼び出す言及... ArrayListの内部からelementDataはもはやIIRC + 50%、それは大きなものにそれをリサイズする十分な大きさではない、とのコピーすべて参照にすると新しいelementData、実際のオブジェクトは移動しません。

最後に、連続したメモリは、通常、高性能ネイティブアプリケーションの懸案事項です。 Javaメモリでは、JVMによって管理され、ハードウェア、または仮想ハードウェアから順に、基本OSから借用されます。

+0

私がこれを探していたのは、他のものよりもさまざまなデータ構造の長所を読んでいたためです。配列の長所の1つは、連続したメモリ割り当てです。 私はArrayListsがあなたの答えからその利点を持っていないと仮定しています。 – adinutzyc21

+0

相対コストの点では配列はJavaでリンクリストというよりはるかに速いでしょう。しかし、Javaは構造体がC++と同じように基底のメモリにマップされる方法を保証します – Adam

関連する問題