2015-12-03 4 views
0

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

Iterator<Position> it = pieces.keySet().iterator(); 
    while (it.hasNext()){ 
     System.out.println("object from key >> " + pieces.get(it.next())); 
    } 
    Iterator<Piece> itt = pieces.values().iterator(); 
    while (itt.hasNext()){ 
     System.out.println("direct object >> " + itt.next().getPosition()); 
    } 

Выхода я получил:

object from key >> null 
direct object >> [email protected] 

кода я показал был использован, как это без всего остального между ними.

Что касается объекта position, я переопределил функцию hashCode(), чтобы вернуть hashCode на основе значений класса Position. Поэтому, когда переменные внутри объекта изменяются, HashCode изменяется. Вышеупомянутый код работает задолго до изменения значения объекта позиции. Но как только я изменю, я получаю нуль через ключ.

+2

Вы абсолютно не можете изменить любые значения, по которым вычисляется 'hashCode', как только ключ находится в' Map'. Вы ** должны ** 'удалить' и повторно ввести 'add' ключ. –

+0

, так что вы хотите сказать, что объект HashMap сохраняет хэш-коды во вставке и не вызывает функцию hashCode(), когда я вызываю функцию get() HashMap? –

+0

Как вы думаете, работает ли 'HashMap'? Как это достигается (амортизируется) 'O (1)' производительность? –

ответ

5

Смотрите соответствующую документацию для Map:

Примечание: большое внимание должно быть осуществлено, если изменяемые объекты используются в качестве ключей карты. Поведение карты не указывается, если значение объекта изменяется таким образом, который влияет на равные сравнения, пока объект является ключом на карте.

Структура данных карты проверяет ваш объект во время вставки для того, чтобы определить, где он должен жить (для HashMap он проверяет hashCode() и помещает его в определенном ведро, для TreeMap он сравнивает его с другими ключами и ставит это в определенной ветви дерева и т. д.). Карты обеспечивают эффективный поиск, потому что тогда только Посмотрите, где объект должен быть, и не выполняйте поиск в других ведрах/остатках дерева. Если вы мутируете объект после сохранения его на карте таким образом, который влияет на место хранения карты, вы нарушаете предположения, которые делает карта. Он будет выглядеть в ожидаемом ведре, не найдет его и не сдастся.

Более подробно о допущениях HashMap делает и почему в этом related answer.

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