Кэш, который использует только ссылку на ключевой объект в java (а не hashCode или equals) - PullRequest
1 голос
/ 15 января 2020

У меня был бы класс, который запускает несколько дорогих вычислений несколько раз. Я хотел бы добавить кеш для него, например:

private Map<MyObj, Result> cache = new HashMap<>();

private Result getFoo(MyObj myObj) {
    Result r = cache.get(myObj);
    if (r == null) {
        r = expensiveCalculation(myObj);
    }
    return r;
}

Поскольку я знаю, что единственный способ, которым два MyObj-s могут быть равны, это если они идентичны (ссылка), я не хочу кеш для вычисления hashCode () и equals (). Есть ли способ иметь карту, которая использует только ссылку для хеширования?

Или лучший способ кеширования, как это?

1 Ответ

0 голосов
/ 05 марта 2020

Обратите внимание, что это не оптимизация. Нет никакой пользы, и ваш код усложняется.

Поскольку я знаю, что два MyObj-ов могут быть равны, если они идентичны (ссылка), я не хочу, чтобы кэш для вычисления hashCode () и equals ().

hashCode всегда рассчитывается для хранения в таблице ha sh. Прежде чем метод equals вызывается для ключевых объектов, в реализациях таблиц ha sh проводится общая оптимизация, чтобы сначала проверить идентичность ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...