2011-03-03 39 views

回答

5

它将在插入时存储对密钥的引用。

的想法是,当您尝试查找由key的条目,哈希代码用于迅速得到的候选人键列表,然后每个候选通过平等检查。

+0

你为什么说在插入时的哈希码存储? – aioobe 2011-03-03 11:58:58

+0

不要质疑Jon Skeet ......你的CPU会炸掉! – jrharshath 2011-03-03 12:01:46

+0

@aioobe:如果不是,哈希表将如何执行查找?我猜想它可能会懒散地得到每个已经没有被散列过的密钥的哈希码,但对我来说这似乎毫无意义。换句话说:对我来说,在插入时计算密钥的哈希代码似乎是明智的。是什么让你觉得它不会? :)(看着HashMap.put确认它,顺便说一句) – 2011-03-03 12:03:02

2

当使用一个HashMap,将HashMap的存储整个对象A作为重点

是整个对象为重点

它将使用关键的hashCode()内部存储Value

让我们看看代码

@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  } 
1

通常它使用散列来查找条目,但条目本身包含值和密钥。这样,你可以调用HashMap#values()来获得一个Set<Entry<key_type, value_type>>,它也包含关键字。

+0

这是'HashMap.entrySet()',实际上 - values()返回一个'Collection '。 – 2011-03-03 12:41:29

相关问题