2015-11-01 8 views
6

私はいくつかの記事を読んでいて、誰かがTrieMapがHashMapを使うのが望ましいと思う状況を提示できるかどうか疑問に思っていました。TrieMapの使用はいつ適切ですか?

TrieMapの使用に動機付けるアーキテクチャの決定は基本的にどのようなものでしょうか?

+0

あなたはscala.collection.concurrent.TrieMapを意味しますか? –

答えて

5

ドキュメントごと。 が安全にになることができる可変コレクションです。マルチスレッドアプリケーションで使用できます。

同時ハッシュトライまたはTrieMapハッシュアレイマッピングされたトライのconcurrent thread-safe lock-free 実装です。これは、 同時マップ抽象化を実装するために使用されます。それはparticularly scalable concurrentの挿入 を持ち、操作を削除し、memory-efficientです。これは、O(1)、アトミック、 のロックフリーのスナップショットをサポートしています。このスナップショットは、線形化可能なロックフリーサイズを実装するために使用され、 イテレータおよびクリア操作です。 (怠惰な)スナップショットを評価するコストは であり、スナップショット評価を水平にスケーラブルにします。

詳細については、以下を参照してください。http://lampwww.epfl.ch/~prokopec/ctries-snapshot.pdf

はまたそれがcachingのために本当に素敵なAPIを持っています。 たとえば、異なる数の階乗を計算しなければならない場合があり、この結果を再利用する必要があります。

object o { 

    val factorialsCache = new TrieMap[Int, Int]() 

    def factorial(num: Int) = ??? // really heavy operations 
    def doWorkWithFuctorial(num: Int) = { 
     val factRes = factorialsCache.getOrElseUpdate(num, { 
     // we do not want to invoke it very often 
     factorial(num) 
      // this function will be executed only if there are no records in Map for such key 
     }) 
     // start do some work `withfactRes` 
     factRes 
    } 
    } 

ご注意 - 書き込み操作のために使用グローバル状態(キャッシュ)上記の機能が、それは並行スレッドでそれを使用するために絶対に安全です。データを失うことはありません。

関連する問題