1

如果我的理解正确,请告诉我:
这里的 HashMap 的大小为 2,因为当我们将键放在下面的地图中时,字符串等于(比较状态/内容而不是堆上的位置)方法会出现

Map hashMap = new HashMap();

hashMap.put("one", "1");
hashMap.put(new String("one"), "2");
hashMap.put("two", "3");
System.out.println("Hash Map KeySet Size : " + hashMap.keySet().size());
4

4 回答 4

5

是的。

源代码就是证明。

由于您使用字符串作为键,key.equals(k) 因此true 对于这种情况"one"作为键。

     public V put(K key, V value) {
387         if (key == null)
388             return putForNullKey(value);
389         int hash = hash(key.hashCode());
390         int i = indexFor(hash, table.length);
391         for (Entry<K,V> e = table[i]; e != null; e = e.next) {
392             Object k;
393             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
394                 V oldValue = e.value;
395                 e.value = value;
396                 e.recordAccess(this);
397                 return oldValue;
398             }
399         }
400 
401         modCount++;
402         addEntry(hash, key, value, i);
403         return null;
404     }

这是基本条件检查:

if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
于 2013-09-10T05:23:42.337 回答
1

对,那是正确的。

作为参考,您可以简单地运行hashMap.size().

于 2013-09-10T05:23:33.743 回答
1

是的。并且您不能在Map.Both中有重复的键"one"并且new String("one")具有相同的状态("one".equals(new String("one")))。所以在这种情况下,前两个具有相同的键。

于 2013-09-10T05:24:16.403 回答
1

因为Map使用equals()方法来检查Map. 它检查对象键是否有意义地相等。在 String 类中,该equals()方法被 覆盖,API并且比较"one"返回new String("one")true。方法返回 true后equals(),新元素替换旧元素,因为Map. 因此,您只有一个带有键“一”的元素

于 2013-09-10T05:27:31.933 回答