В случае использования у меня есть HashMap, который содержит 1 запись, а ключ - A. Мне нужно многократно вызывать get() с ключом B. A равно() в B, но A и B не являются одним и тем же объектом. Ключ содержит длинный массив, поэтому его equals() стоит дорого. Я пытаюсь улучшить производительность для этой операции проверки карты. Я знаю, что есть подходящие способы решения проблемы производительности. Тем не менее, я рассматриваю взлом, который является наиболее целесообразным.java HashMap key swap во время get()
Следующая от HashMap.java:
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;
}
если я изменить, если блок в цикл для:
if (e.hash == hash) {
if (e.key == key) {
return e.value;
} else if (e.key.equals(key)) {
e.key = (K) key;
return e.value;
}
}
Я думаю, что это поможет ПРЕДСТАВЛЕНИЕМ много. В первый раз, когда я вызываю get() с ключом B, будет вызываться equals() B. В остальное время B будет == к ключу на карте, таким образом, сохраняет вызов equals().
Однако нельзя просто расширить HashMap и переопределить get(), так как HashMap.field защищен пакетом и Entry.key является окончательным.
Вопросы:
Будет ли эта схема работы?
Копирование HashMap.java и связанного с ним кода только для изменения одного метода не очень привлекательно. Каков наилучший способ реализации этого взлома?
Спасибо!
Почему у вас есть хэш-карта только с одной записью? – Behe
Бывает так. Однако, я думаю, это не имеет значения. Он может содержать больше записей, и я думаю, что мой подход все равно должен работать. – user3258744