2017-12-24 15 views
-3

私たちはすべてのTIBCOアプリケーションでデータベーステーブルをキャッシュするためにjavaHashmapを使用しています。私はJavaHashmapが実際にインデックスされるか、Javaでデータベーステーブルをキャッシュするためのより良い方法があるかどうかを知りたいjavaHashmapは完全にインデックスされていますか?

public class WrapConvTableInfo { 

    private static HashMap<String, WrapConvTableInfo_Entry> _wrapConvMap; 


public WrapConvTableInfo() { 

    _wrapConvMap = new HashMap<String, WrapConvTableInfo_Entry>(); 
} 

上記は参照用のコードスニペットです(新しいフレームワークを追加することはできません)。

+1

はいインデックスが作成されています。 [HashMap](https://docs.oracle.com/javase/9​​/docs/api/java/util/HashMap.html)。 – Zachary

+0

「本当にインデックス登録済み」とはどういう意味ですか?あなたの例は 'WrapConvTableInfo_Entry'オブジェクトを' String'キーでインデックスします。 – Eran

+0

私はJavaのエキスパートではないので、HashMapはデフォルトでインデックスされたStringキーでインデックスされていると言っていますか?私たちは何千ものレコードをキャッシュします –

答えて

1

HashMapは、テーブルではなくキー値ストアです。データベース内のテーブルの場合のようにここでインデックスを作成するという概念はありません。キーのハッシュに基づいて動作します。

HashMapにはバケットと呼ばれるものが含まれています。キーはハッシュされ、ハッシュ値はバケット数で除算されます。残りはあなたの価値が行くバケット番号です。

たとえば、私のHashMapには16個のバケットがあります。

ここで、HashMapに鍵の値のペア<foo,bar>を挿入することを前提としています。

  • 最初にfooのハッシュが計算されます。この例では、返されるハッシュ値が61であるとしましょう。
  • 61%(剰余)が1であるため、値がバケット1になります。
  • このように、挿入されているすべての値は、このようなバケットに分割されています。ハッシュ関数が良好であれば、すべてのバケットは同じ値を持つ必要があります。 HashMapの

    • fooのハッシュバケット番号最初から

    フェッチ値は、挿入と同様に計算されます。

  • ここでは、バケット内に存在するキーと値のペアで値を検索する必要があります。これは時間を節約します。 Java 8では、バケットに8つ以上の値がある場合、バケットは値をツリーの形式で格納してより高速にアクセスできます。
  • キャッシングにHashMapを使用している場合は、最初にどれくらいの大きさにする必要がありますか? HashMapがいつ成長するべきか(loadFactor)、バケットの数が少なければ、バケット数が少なくて済むので、検索するには値が多すぎます。一方、バケットが多すぎると、CPU上のL1キャッシュが無駄になります。さらに、アプリケーションがマルチスレッドの場合、HashMapはスレッドセーフではなく、破損したキャッシュで終了します。その場合はConcurrentHashMapを使用する必要があります。

    関連する問題