web-dev-qa-db-ja.com

Map.clear()vs新しいマップ:どちらが良いでしょうか?

Map<String, String> testMap = new HashMap<String, String>();のような構文としてMapがあります。このマップには、1000個のデータを含めることができます。

アプリケーションで新しいデータのリストが必要な場合、マップをクリアする必要があります。しかし、Map.clear()のコードを

_/**
     * Removes all of the mappings from this map.
     * The map will be empty after this call returns.
     */
    public void clear() {
        modCount++;
        Entry[] tab = table;
        for (int i = 0; i < tab.length; i++)
            tab[i] = null;
        size = 0;
    }
_

私は明確な方法がn回ループすることを理解しています(nはMapのデータ数です)。そのため、MapをtestMap = new HashMap<String, String>();として再定義し、以前に使用されたMapがガベージコレクションされるように再定義する方法があると考えました。

しかし、これが良い方法かどうかはわかりません。モバイルアプリケーションに取り組んでいます。

案内してもらえますか?

88
Pankaj Kumar

複雑な質問。しばらく様子を見てみましょう。

新しいインスタンスをインスタンス化します。これは、新しい配列でバックアップされます。したがって、ガベージコレクターは、前のマップからすべてのキーと値をクリアし、それ自体への参照をクリアする必要があります。とにかくO(n)アルゴリズムは実行されますが、ガベージコレクタースレッドで実行されます。1000レコードの場合、違いはありません。しかし、パフォーマンス ガイド は可能であれば、常に新しいオブジェクトを作成しない方がよい。したがって、clear()メソッドを使用します。

とにかく、両方のバリアントを試して、測定してみてください。常に測定する!

94
Vladimir Ivanov

サイズnのマップでMap.clear()と言うとき... GCに_2*n_(キーと値)オブジェクトをクリーンアップするように要求しています。同じマップに対してnullと言うとき、GCに_2*n+1_(マップ自体の場合は1)オブジェクトをクリーンアップするように要求します。次に、新しいMapインスタンスを作成する必要がありますが、さらにオーバーヘッドがかかります。 Map.clear()に進みます。マップのインスタンス化中にマップのサイズを事前に設定するのが賢明です。

21
Tanveer

Javaメモリの点でより高価であるため、オブジェクトを作成すると思ったので、.clear()を使用することをお勧めします。

9
sunriser

Clear()メソッドを持つという考え方は、マップから他のオブジェクトへの参照を削除し、「マップが他の場所で参照されている」場合にキー/値がgcingを妨げないようにすることです。

ただし、マップが特定のコードでのみ使用されるローカルマップ(つまり、「マップはどこか他の場所で参照されていない」)の場合は、代わりに新しいマップを使用しますが、nullに1000の参照を設定してもパフォーマンスに大きな影響はありませんとにかく。

5
Suraj Chandran

地図の再配置を忘れないでください

新しいマップで容量を指定しない場合、リハッシュ(それぞれO(n)(当時))のため、新しく作成されたマップでかなりのオーバーヘッドが発生しますそして起こるO(log(n))回これはO(n)合計に償却するかもしれないが、そもそも起こらない場合まだ良いでしょう)

容量が変わらないため、これはクリアされたマップでは発生しません

2
ratchet freak

すべてのデータを削除するmap.clear()。これはすべてのエントリを破棄するだけで、エントリを同じサイズで保存するために使用される内部配列を保持することに注意してください(初期容量に縮小するのではなく)。それも削除する必要がある場合、最も簡単な方法は、HashMap全体を破棄し、それを新しいインスタンスに置き換えることです。もちろん、マップへのポインタを持つユーザーを制御する場合にのみ機能します。

メモリの再利用については、ガベージコレクターに作業を行わせる必要があります。

あなたの価値も長いですか?この場合、 GNU Trove library にあるTLongLongHashMapなどの汎用HashMapよりも(メモリ)効率の良い実装を検討する必要があります。それは多くのメモリを節約するはずです。

1
Pratik

新しいHashMap()を呼び出すことは、ハッシュマップをクリアするほど多くの処理を行う必要がないため、より良いアイデアだと思います。また、新しいハッシュマップを作成することにより、データを使用するコントロールにハッシュマップがまだバインドされている可能性がなくなり、ハッシュマップをクリアするときに問題が発生します。

1
A. Abiri