2017-08-02 15 views
-2

リストがあります< ArrayList <文字列> >オブジェクトがJavaにあります。内側のArrayList <文字列>は一定のサイズです。最小限のメモリ消費でResuse ArrayList

したがって、Listにデータを入力するときに、次のロジックを使用しています。

マップ内のすべてのリストは、NULL値で埋められます。

List<ArrayList<String>> map = new ArrayList<ArrayList<String>>(); 
ArrayList<String> list = new ArrayList<String>(); 
for(i = 0; i < 10; i++) { 
    .... 
    list = new ArrayList<String>(); 
    for(j = 0; j < 10; j++) { 
     list.add(/* some string */); 
    } 
    map.add(list); 
    //list.clear(); 
} 

私はListオブジェクトに格納する必要が約100000のArrayListのデータセットを持っていると私はインスタンス化したくない: はまた、個別に各ループのリストをインスタンス化し、同じように、私の問題を解決しますメモリオーバーヘッドのため、ArrayListを毎回呼び出します。

List<ArrayList<String>> map = new ArrayList<ArrayList<String>>(); 
ArrayList<String> list = new ArrayList<String>(); 
for(i = 0; i < 10; i++) { 
    .... 
    for(j = 0; j < 10; j++) { 
     list.add(/* some string */); 
    } 
    map.add(new ArrayList<String>(list)); 
    list.clear(); 
} 

は、これらのメソッドの(パフォーマンスが優先ではありません)私に少なくともメモリ消費を与える:

だから、代わりに別途、それをインスタンス化のため、私は1つの以上の方法を試してみましたか? これ以外の場合は、これをより効率的に行うための別の方法がありますか?

+0

「新しいArrayList (list)」を実行していることにお気づきになりませんでした。それから、「クリア」する必要があります –

+0

マップオブジェクトに追加されたリストもnull値にクリアされていない場合を除いて、例外があります。私はそれをクリアする前にリストへの参照を変更する必要があり、唯一の方法はそれをインスタンス化することです。 – Penman

+0

コードブロック2は 'クリア'を行う必要はありません –

答えて

3

メモリの消費について気になる人は、リストの記入が完了したらtrimToSize()に電話してください。これにより、空の容量が削除されます(要素を追加する場合はサイズ変更が必要です)。

別のリストを使用する必要があるので、2番目の方法は、正気なプログラマが行うことです。

メモリオーバーヘッドが であるため、ArrayListを毎回インスタンス化したくありません。

メモリがありませんオーバーヘッドです。あなたはあなたが必要なので、メモリを使用しています。もしあなたが〜100,000のリストを持ちたいなら、あなたは約10万のリストを作成しなければならなくなります。

0

どちらもありません。そして両方。 Javaはガベージコレクション言語です。メモリ消費量は、JVMの設定によって厳密な上限が設定されています。

+0

どちらも意味しないのは何ですか? – Penman

1

オブジェクトへのポインタをリストに格納することを忘れないでください。オブジェクトそのものではありません。

ArrayList<String> list = new ArrayList<String>(); 
for(i = 0; i < 10; i++) { 
    .... 
    for(j = 0; j < 10; j++) { 
     list.add(/* some string */); 
    } 
    map.add(list); 
    list.clear(); 
} 

あなたは、あなたがリスト内のすべてのものを削除マップオブジェクトAのリストを格納します。 の地図のリストはあなたのリストのコピーではありません!最後に、マップには同じ空のリストの10倍が含まれます。

javaでは、配列リストのサイズは、ポインタ(64ビット)+コンテンツの 'arraysize'ポインタ+ stuffのためのいくつかのバイトになります。 'Arraysize'はコンテンツサイズではありません。 消費量を少なくするには、配列サイズをコンテンツサイズに設定できます。

List<ArrayList<String>> map = new ArrayList<ArrayList<String>>(10); 
for(i = 0; i < 10; i++) { 
    .... 
    ArrayList<String> list = new ArrayList<String>(10); 
    for(j = 0; j < 10; j++) { 
     list.add(/* some string */); 
    } 
    map.add(list); 
} 

とにかく、通常はリストサイズはコンテンツサイズに比べて何もありません。

+0

あなたが提案したコードブロックと私のコードブロック2のメモリ効率は異なりますか? – Penman

+0

私の最後のコードブロックは、arraylistの内部サイズを実際のサイズと一致させました。だから、あなたが容量を自動的に(サイズ10で、私は容量が12または16になるかどうか覚えていない)ようにするより少し少ないメモリを得るのでyeahhhh!あなたは16メガバイトから54メガバイトの違いがあります。 – wargre

関連する問題