Как java HashMap делает цепочку? как получить доступ ко всем значениям коллизий? - PullRequest
4 голосов
/ 26 декабря 2011

Я где-то читал, что HashMap использует цепочку для разрешения коллизий.Но если это так.Как я могу получить доступ ко всем элементам с одинаковым значением ключа.

Например:

HashMap<Integer, String> hmap = new HashMap<Integer, String>();
hmap.put(1, "1st value");
hmap.put(1, "2nd value");
hmap.put(1, "3rd value");
hmap.put(1, "4th value");

Теперь, если я делаю hmap.get (1), он возвращает «4-е значение»

если действительно, это действительно цепочка, как

Ключевые значения 1 «4-е значение» ---> «3-е значение» ---> «2-е значение» ----> «1-е значение»

Как получить другие значения?

hmap.get(1) возвращает только 1-е значение.

Мой второй вопрос:

, еслиэто делает линейное сцепление.Как я могу удалить любое одно значение для ключа.Предположим, я хочу удалить «4-е значение» из моего хэш-карты и сохранить все остальные значения для того же ключа, как я могу это сделать?

, если я сделаю

hmap.remove(1);

, удаляет всю цепочку.

Ответы [ 5 ]

11 голосов
/ 26 декабря 2011

HashMap не может хранить несколько значений для одного и того же ключа.

Цепочка используется для разрешения коллизий хеша, то есть ситуаций, когда разные ключи имеют одинаковый хеш. Таким образом, речь идет не о сохранении нескольких значений с одним и тем же ключом, а о нескольких значениях, ключи которых имеют одинаковые хеши.

Структура данных, в которой могут храниться несколько значений для одного и того же ключа, называется мультикартой. К сожалению, в JRE нет встроенной реализации multimap.

Если вам нужна мультикарта, вы можете поддерживать Map из List s (как предложено matsev) или использовать существующую реализацию мультикарты из сторонней библиотеки, такой как Google Guava .

Смотри также:

1 голос
/ 26 декабря 2011

Вы, очевидно, ищете структуру данных, такую ​​как MultiMap в Guava, которая позволяет в точности то, что вы хотите: иметь несколько значений на ключ.

Java HashMap выполняет , а не делает цепочку, поскольку документация для put(K, V) четко гласит:

открытый V пут (ключ K, значение V)

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

1 голос
/ 26 декабря 2011

Из документации HashMap.put (K, V) :

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

Что вы можете сделать, это поставить List в качестве значения , например

HashMap<Integer, List<String>> hmap = new HashMap<Integer, List<String>>();
List<String> list = hmap.get(1);
if (list == null) {
    list = new ArrayList<String>();
    hmap.put(1, list);
}
list.add("1st value");
list.add("2nd value");
// etc
0 голосов
/ 01 июня 2018

Если вы сохраните существующий ключ в HashMap, он заменит старое значение новым, а put () вернет старое значение

      System.out.println(hmap.put("1",1st value));
      System.out.println(hmap);  // o/p "1st value"
0 голосов
/ 26 декабря 2011

Я не думаю, что HashTable позволяет дублировать ключи.Вы должны прочитать это Что происходит, когда дублирующий ключ помещается в HashMap?

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