ソースコードを見ることができます。 (私はJDK 6で探しています)HashMap.get()非常に単純です:
ハッシュ()
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
は、あなたのハッシュコードを「改善」するためにいくつかの余分なシフトとXOR演算を行います。
ConcurrentHashMap.get()もう少し複雑ではなく、多く再び
public V get(Object key) {
int hash = hash(key.hashCode());
return segmentFor(hash).get(key, hash);
}
、ハッシュ()は、いくつかのシフト及びXOR演算を行います。 setMentFor(int hash)単純な配列検索を行います。唯一の複雑なものはSegment.get()です。しかし、たとえそれはロケット科学のようには見えません。
V get(Object key, int hash) {
if (count != 0) { // read-volatile
HashEntry<K,V> e = getFirst(hash);
while (e != null) {
if (e.hash == hash && key.equals(e.key)) {
V v = e.value;
if (v != null)
return v;
return readValueUnderLock(e); // recheck
}
e = e.next;
}
}
return null;
}
ロックを取得している一つの場所)がreadValueUnderLock(です。コメントは、これはメモリモデルの下では技術的には合法だが、発生することは知られていないと述べている。
全体的に見て、コードはかなり類似しているようです。 ConcurrentHashMapでちょっと整理されています。だから私はパフォーマンスが十分に似ていると思います。
しかし、putsが本当に非常に稀であれば、「コピーオンライト」タイプのメカニズムを実装することを検討できます。
ConcurrentHashMapはスレッドセーフです。それはそれに対するすべての操作のオーバーヘッドが付属しています。しかし、あなたのアプリが時間の90%を値から取得しない限り、違いを気付かないでしょう。 – bdares
こんにちは、なぜ私はdownvoteを取得するのですか?理由を説明してください! – user1145216
あなたはAPIを見ましたか?書き込みは同期され、取得は行われないことが明確に示されています。知るべきことは他に何がありますか? – blackcompe