2

デュアルキー同時ハッシュマップが必要です。Javaのデュアルキー同時ハッシュマップについて

私の最初の試行は、java.util.concurrent.ConcurrentHashMapを使用しています。このように

ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>(); 
map.put("key1" + "|" +"key2", "value"); 
String vaule = map.get("key1" + "|" +"key2"); 

しかし、私はこれは醜いと思います。

私の2回目の試みは、オブジェクトをキーとして使用しています。この

@Data 
public class DualKey { 
    private final String key1; 
    private final String key2; 
} 
map.put(new DualKey("key1", "key2"), "value"); 
String vaule = map.get(new DualKey("key1", "key2")); 

最終試しのようなDualkeyConcurrentHashMapを作成することです。私はちょうど、get、containsKeyを入れる必要があります。

public class DualkeyConcurrentHashMap<K1, K2, V> { 
    private final ConcurrentHashMap<K1, ConcurrentHashMap<K2, V>> map 
                = new ConcurrentHashMap<>(); 

    public V put(K1 key1, K2 key2, V value) { 
     ConcurrentHashMap<K2, V> subMap 
        = map.computeIfAbsent(key1, k -> new ConcurrentHashMap<>()); 
     return subMap.put(key2, value); 
    } 

    public V get(K1 key1, K2 key2) { 
     ConcurrentHashMap<K2, V> subMap = map.get(key1); 
     return null == subMap ? null : subMap.get(key2); 
    } 

    public boolean containsKey(K1 key1, K2 key2) { 
     return null != get(key1, key2); 
    } 
} 

スレッドセーフです。 (私はすべての方法を決定できません

もう1つの方法がありますか?

+0

すべてのソリューションに対して既に(おそらく)動作しているコードがあるので、ベンチマークを実行します。違いがある場合は、あなたの質問に答えます。結果を見るのが大好き。 – Antoniossss

+1

私は値オブジェクトのアプローチが好きではありません。マップから値を取得するためにオブジェクトを作成するだけです。 – SHaaD

+1

最初のオプションは実際にはすべてのキーで機能しません。 '' a "、" b | c "' 'と' 'a | b ''、 'c''に対して使用されます。 –

答えて

3

All options are thread-safeConcurrentHashMapで保証されています)。 fact to note is重要:

しかし、すべての操作がスレッドセーフであっても、検索 操作がロック伴わず、すべてのアクセスを防止する方法で、テーブル全体をロック に対するサポートはありません。このクラス は、そのスレッドの安全性については に依存するが、その同期の詳細には依存しないプログラムでHashtableと完全に相互運用可能です。

デュアルキーマップを実装する自然な方法は、オブジェクトを提供することです。したがって、私は2番目のものと一緒に行くつもりです。DualKeyは一般的になります。

最初のものは実装とデザイン(string1 "|" + string1キー形式)を結合し、キーとして使用する型を簡単に変更することはできません。

第3のものは、必要以上に多くの場合ConcurrentHashMapを使用します。

関連する問題