Yossale
Yossale

Reputation: 14361

When using HashMap<ObjectA,ObjectB> in java , what is the type of the key?

When using a HashMap, will the hashmap store the entire objectA as a key , or will it only use the objectA.hashCode() as the key , thus resulting in an actual hashmap of int->ObjectB ?

Upvotes: 1

Views: 288

Answers (4)

Thomas
Thomas

Reputation: 88737

Generally it uses the hash to find the entry but the entry itself contains both, the value and the key. That way you can call HashMap#values() to get a Set<Entry<key_type, value_type>> which contains the keys as well.

Upvotes: 1

Jon Skeet
Jon Skeet

Reputation: 1502336

It will store the reference to the key and the hash code at the time of insertion.

The idea is that when you try to look up an entry by key, the hash code is used to quickly get to a list of candidate keys, and then each candidate is checked via equality.

Upvotes: 5

Jonathan
Jonathan

Reputation: 3253

It will use the entire object.

Upvotes: 2

Jigar Joshi
Jigar Joshi

Reputation: 240938

When using a HashMap, will the hashmap store the entire objectA as a key

Yes whole object as key

It will use key's hashCode() internally to store Value

Lets look into code

@Override
  461       public V get(Object key) {
  462           Entry<K, V> m = getEntry(key);
  463           if (m != null) {
  464               return m.value;
  465           }
  466           return null;
  467       }
  468   
  469       final Entry<K, V> getEntry(Object key) {
  470           Entry<K, V> m;
  471           if (key == null) {
  472               m = findNullKeyEntry();
  473           } else {
  474               int hash = computeHashCode(key);
  475               int index = hash & (elementData.length - 1);
  476               m = findNonNullKeyEntry(key, index, hash);
  477           }
  478           return m;
  479       }

           final Entry<K,V> findNonNullKeyEntry(Object key, int index, int keyHash) {
  482           Entry<K,V> m = elementData[index];
  483           while (m != null
  484                   && (m.origKeyHash != keyHash || !areEqualKeys(key, m.key))) {
  485               m = m.next;
  486           }
  487           return m;
  488       }

Upvotes: 2

Related Questions