Вы можете посмотреть на исходный код.(Я смотрю на 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;
}
Где hash () делает некоторые дополнительные смещения и XORing, чтобы «улучшить» ваш хэш-код.
ConcurrentHashMap.get () немного сложнее, но не намного
public V get(Object key) {
int hash = hash(key.hashCode());
return segmentFor(hash).get(key, hash);
}
Опять же, hash () выполняет некоторое смещение и XORing.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.Поэтому я предполагаю, что производительность достаточно схожа.
Тем не менее, если путы действительно крайне редки, вы можете рассмотреть возможность реализации механизма типа «копирование при записи».