Хранилище HashMap.containsValue-в чем смысл?

У меня есть HashMap и мне нужно получить элемент по его целочисленное значение. Я замечаю, что есть функция containsValue (), но, похоже, мне все равно придется перебирать карту, чтобы найти правильный индекс.

мой вопрос: зачем использовать containsValue (), если я должен пересечь его после этого?

кроме того, я совершенно упускаю? ;-)

6 ответов


карта сопоставляет ключ со значением. Если у вас есть значение, и вы знаете, что карта содержит это значение, зачем вам больше нужен ключ?

С другой стороны, если вам действительно нужен ключ, или у вас есть просто свойство стоимости, вы можете перебирать entrySet(), проверьте значение и верните ключ, если он найден:

for (Map.Entry<Index,Value> entry : map.entrySet()) {
  if (entry.getValue().getXy().equals(xy)) {
    return entry.getKey();
  }
}

карта-это ключ to хранить значение. Утверждение, что значение содержится, дается только как указание. Я думаю, что для того, чтобы иметь биективную ссылку, позволяющую вам извлекать ключ из значения, вам придется полагаться на такие вещи, как BiMap из google-коллекций


HashMap (или карта в целом) использует пары ключ/значение. Когда вы добавляете что-то на карту, вы должны указать ключ, и именно этот ключ используется позже при получении значения. На основе реализации HashMap, учитывая ключ, извлечение значения выполняется в O (1) раз.

containsValue является полезным методом для проверки того, что HashMap содержит значение, которое вы ищете, но я действительно не понимаю, почему вы используете это для получения значения, которое вы ищете для??

correft способ использования карты будет что-то вроде:

HashMap<Integer, Object> myMap = new HashMap<Integer, Object>();
myMap.put(1, object1);
myMap.put(2, object2);
myMap.put(3, object3);

теперь вы можете получить свои объекты, выполнив:

Object myObject = myMap.get(1);

если ты:

myMap.containsValue(1);

это вернет false, так как 1 является ключом, а не значением. Вы могли бы сделать:

myMap.containsKey(1);

если вы просто хотите знать, существует ли он, но нет никаких проблем в вызове:

Object myObject = myMap.get(99);

Он просто вернул бы null, если бы не было ключа, 99.

Итак, в основном, дело в том, что вы правы, нет смысла использовать containsValue, когда вы пытаетесь получить значение. Используйте get или containsKey, если вы хотите сначала проверить наличие.


вы не обязаны пересекать его после этого. containsValue() полезно в ситуациях, когда вам не нужно точно знать, где значение вы, а скорее, когда вам нужно только знать, если это уже на карте. В ситуациях, когда вам нужно точно знать, где на карте находится значение, не беспокойтесь об использовании containsValue() -- перейти прямо к итератору и найти его.


вы можете использовать containsValue () в случаях, когда вам не нужно пересекать всю hashmap, например, если вы хотите добавить пару ключ-значение в hashmap, но до этого вы хотите знать, находится ли это значение в hashmap. В этом случае для операции добавления вам не нужно пересекать весь hashmap.


позвольте мне переформулировать этот вопрос Фредерик:

Ну, containsValue (), сравнивает ли он внутренне (его входной параметр) с каждым "значением" в hashmap? Или он использует как-то hashcodeing (или другую технику) для генерации результата? В первом случае мы могли бы просто использовать итератор для пересечения и сопоставления существования нашего значения со всем "значением" hashmap. Значение вопроса заключается в производительности, или скорости!