2

簡単にするためにHashMap<String, String>、同じキーを共有する 2 つのインスタンスがあるとします。私が知りたいのは、それと、これらの 2 つのString値を で表すこととObject、それらを に格納することとの間にパフォーマンスとメモリの違いがあることHashMap<String, Object>です。

私の実際の問題は のインスタンスHashMap<String, HashSet<String>>と の 2 つのインスタンスを使用しており、それらを統合することで何らかの形でメモリを節約できることを望んでいましたが、自己定義オブジェクトとネイティブ オブジェクトのHashMap<String, Double>使用によるパフォーマンスへの影響があるかどうかはわかりませんでしたObjectのようにHashSet、またはDouble値として。

4

4 に答える 4

5

ハッシュは文字列から計算されるため、速度への影響はありません。スペースへの影響 (ごくわずかな増加) は、長期的には無視できます。コードが読みやすくなる場合は、それを実行してパフォーマンスを低下させます (パフォーマンスの大きなボトルネックについて話しているのでない限り、それは問題ではありません)。

スピード

速度への影響については、 でHashMap<String, ?>Stringハッシュされることに注意してください。3 回の検索と比較して、カスタム オブジェクトを見つけるために 1 回の検索のみを実行する必要があるため、実際には速度がわずかに向上することがあります。

スペース

HashMapスペースへの影響については、2 の累乗のサイズの内部配列を使用することを覚えておいてください。HashMapカスタム負荷係数などの特別な設定を行わずにバニラのみを使用している場合は、わずかなスペースの増加が見られる場合があります。 (もちろん、これは単純化しただけです):

HashSet<String>[]
Double[]
Double[]

そして、それを組み合わせた後、あなたは

CustomObject[]
    HashSet<String>
    Double
    Double

これは、マップと共に成長しない一定サイズの情報を無視しています。オブジェクトは、フィールドへの参照よりも多くのスペースを占有しますが、それほど多くはありません。

読みやすさ

カスタムオブジェクトオプションは、これを圧倒します. これは非常にクリーンで、非常に OOP であり、Java に非常によく適合します。パフォーマンスに関係なく、とにかくこれを行う必要があります。長い目で見れば見栄えが良くなり、メンテナンスも容易になります。

たとえば、カスタム オブジェクトにフィールドを追加するのは簡単です。しかし、個別のマップを持つということは、より多くの変数に対してより多くのマップを作成することを意味し、これは汚いことです。私はOOPの道を行くと言います。

于 2012-10-17T17:56:12.133 に答える
1

それらを組み合わせたい場合は、それらを表すクラスを作成し、それらのマップを作成します。

public class Stuff {
    String a;
    String b;
    // other fields - maybe the double you mentioned
}

HashMap<String, MyStuff> map;

マップ エントリが少なくなるため、メモリを確実に節約できます。

ただし、とにかくそれを行うのが正しい方法です。設計時は、パフォーマンスやメモリへのわずかな影響について心配するときではありません。コードを読みやすく使いやすくすると、あなたの生活 (およびコード) が向上します。

于 2012-10-17T17:58:12.133 に答える
0

非常に多数のエントリを扱っている場合を除き、違いが (あるとしても) 重要ではない可能性があります。また、プラットフォーム (JVM のバージョン、Java ライブラリのバージョンなど) にも密接に結び付いているため、唯一の有用な答えは、それぞれの異なる方法に対して実行されたプロファイラーから得られます。

Guava Multimapを見ることを検討してください。それはあなたの問題に対するよりクリーンな解決策かもしれません。それができない場合は、カスタム オブジェクトを使用します。コードの明快さは、時期尚早の最適化に対して常に勝ちます。

于 2012-10-17T17:58:57.857 に答える
0

表を組み合わせることで、多くの点でより良い結果が得られるでしょう。速度的には、ハッシュを計算し、ハッシュ チェーンを 2 回ではなく 1 回歩くだけで済みます。スペースについては、2 つではなく 1 つのハッシュ テーブル (負荷率が約 50% の場合、エントリあたり約 8 バイトを節約) と 2 つではなく 1 つのハッシュ チェーン (エントリあたり約 16 バイトでハッシュ チェーン オブジェクトを節約) が必要です。ペア オブジェクトのコストを支払いますが、それは最大で 16 バイトです。

于 2012-10-17T18:00:34.447 に答える