1

私の理解が正しいかどうか教えてください:
HashMap のサイズはここでは 2 です。これは、以下のマップにキーを配置すると、String equals(状態/コンテンツを比較し、ヒープ上の場所を比較しない) メソッドが表示されるためです。

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

はい。

ソースコードがその証拠です。

Strings as keys を使用して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

はい。and Map.Both"one"new String("one")has same state( "one".equals(new String("one"))).したがって、この場合、最初の 2 つは同じキーを持ちます。

于 2013-09-10T05:24:16.403 に答える