2014-09-23 2 views
2
Map<Integer,String> m1 = new HashMap<>(); 

     m1.put(5, "gfd"); 
     m1.put(1,"sandy"); 
     m1.put(3, "abc"); 
     m1.put(2, "def"); 
     m1.put(1, "ijk"); 
     m1.put(10, "bcd"); 
     m1.put(0, "ssdfsd"); 

Когда я Распечатайте карту, выход {0 = ssdfsd, 1 = IJK, 2 = Защита, 3 = азбука, 5 = GFD, 10 = BCD}.Как HashMap работает с Integer в качестве ключей

Но, как вывод в отсортированном порядке, хотя я использовал HashMap() ??

+1

Вы можете взглянуть на исходный код для себя ... –

+0

не каждый раз, запускайте его трижды или что-то в этом роде, добавляя больше элементов на карте, определенно покажите –

+2

@ HussainAkhtarWahid'Ghouri ': почему это было бы недетерминирована? –

ответ

0

Вы можете легко увидеть это в реализации. Если вы посмотрите в источник HashMap.put(), вы можете увидеть, что индекс хэш-таблицу объекта определяется следующим образом:

int hash = hash(key.hashCode()); 
int i = indexFor(hash, table.length); 

Методы hash() и indexFor() только убедитесь, что не слишком много столкновений хэш-значений и они не превышают длину хэш-таблицы.

Теперь, если вы посмотрите на Integer.hashCode(), вы увидите, что хэш само целое число:

public int hashCode() { 
    return value; 
} 

Так целое число, которое имеет значение 0 заканчивается в индексе 0 хеш-таблицы и скоро. По крайней мере, пока хэш-таблица достаточно большая.

Метод HashMap выполняет итерацию по таблице хэша и элементы в каждом индексе хэш-таблицы. Поэтому в вашем случае заказ сохраняется.

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

0

A Map предоставляет вам интерфейс хранения и извлечения объектов в карту с прикрепленным к ним ключом.

Что каждая реализация выполняет внутренне полностью, вплоть до того, что пары ключ/значение хранятся во внутренней структуре. См. Ответ @ Seshoumaro для цитаты из javadoc.

HashMap хэширует ключ (который в данном случае является Integer) и использует этот хэш в качестве индекса массива. Поскольку hashCode для Integer довольно просто писать самостоятельно, неудивительно, что индексы массивов для каждого из них находятся в том же порядке, что и сам ключ.

Что это означает: вы не должны удивляться, что HashMap действует следующим образом.

0

HashMap не предоставляет никаких гарантий относительно порядка хранения предметов. Это может даже быть в порядке в некоторых случаях. Взято с javadoc:

Этот класс не дает никаких гарантий относительно порядка карты; в частности, он не гарантирует, что порядок будет оставаться постоянным с течением времени.

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

0

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

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

См this для более

Смежные вопросы