Java утилита hashmap содержит ключ ()

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

HashMap<IdentifierInterface, Set<NaturalNumberInterface>> hashMap;
HashMap<StringBuffer, Integer> works;

TryHashmap(){
    hashMap = new HashMap<IdentifierInterface, Set<NaturalNumberInterface>>();
    works = new HashMap<StringBuffer, Integer>();
}
private void start() {      
    Identifier iden = new Identifier('a');
    NaturalNumber nn = new NaturalNumber('8');
    Set<NaturalNumberInterface> set = new Set<NaturalNumberInterface>();
    set.insert(nn);

    hashMap.put(iden, set);
    System.out.println(hashMap.containsKey(iden));

    Identifier newIden = new Identifier('a');
    System.out.println(hashMap.containsKey(newIden)); //TODO why is this not true?

    iden.init('g');
    System.out.println(hashMap.containsKey(iden));
}

public static void main(String[] argv) {
    new TryHashmap().start();
}

Конструктор класса Identifier выглядит следующим образом, init() похож, но он удалит все, что было в идентификаторе ранее.

Identifier(char c){
    iden = new StringBuffer();
    iden.append(c);
}

Я помещаю что-то в хеш-карту, используя идентификатор в качестве ключа, но когда я пытаюсь использовать идентификатор с другим именем, но с тем же содержимым, функция containsKey возвращает false, где я ожидаю истину. (вывод выводит true false false true)

Заранее спасибо!

2 ответа

Воплощать в жизнь equals() а также hashCode() для идентификатора объекта. hashCode необходимо, чтобы найти соответствующее ведро и equals требуется обрабатывать столкновения во время хеширования.

Дальнейшее чтение

Метод containsKey в HashMap.class

/**
 * Returns <tt>true</tt> if this map contains a mapping for the
 * specified key.
 *
 * @param   key   The key whose presence in this map is to be tested
 * @return <tt>true</tt> if this map contains a mapping for the specified
 * key.
 */
public boolean containsKey(Object key) {
    return getEntry(key) != null;
}

метод getEntry в HashMap.class

   /** 
     * Returns the entry associated with the specified key in the 
     * HashMap.  Returns null if the HashMap contains no mapping 
     * for the key. 
     */  
    final Entry<K,V> getEntry(Object key) {  
        int hash = (key == null) ? 0 : hash(key.hashCode());  
        for (Entry<K,V> e = table[indexFor(hash, table.length)];  
             e != null;  
             e = e.next) {  
            Object k;  
            if (e.hash == hash &&  
                ((k = e.key) == key || (key != null && key.equals(k))))  
                return e;  
        }  
        return null;  
    }  

метод getEntry сказал нам, что результат будет true, только если Объект a имеет то же самое hashCode() как объект b а также a.equals(b)

Другие вопросы по тегам