7
    ArrayList<Integer> lis = new ArrayList<Integer>();
    lis.add(2);
    lis.add(3);
    ArrayList<Integer> lis2 = new ArrayList<Integer>();
    lis2.add(2);
    lis2.add(3);
    HashMap<ArrayList<Integer>, Integer> map = new HashMap<ArrayList<Integer>, Integer>();
    map.put(lis, 7);
    System.out.println(map.containsKey(lis2));

最初は、lis と lis2 は異なるオブジェクトであるため、コードが「false」を出力すると予想していました。驚いたことに、コードは「true」を出力しました。hasmap は、containsKey() を呼び出すときに何をチェックしますか?

4

4 に答える 4

3

これは、lis と lis2のhashCodeが等しいためです。

lis2.hashCode() == lis.hashCode() は真です。

ソース コード (HashMap) 内のメソッドcontainsKeyは次のとおりです。

/**
 * 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) {
    Object k = maskNull(key);
    int hash = hash(k.hashCode());
    int i = indexFor(hash, table.length);
    Entry e = table[i]; 
    while (e != null) {
        if (e.hash == hash && eq(k, e.key)) 
            return true;
        e = e.next;
    }
    return false;
}
于 2013-10-29T07:23:47.810 に答える
1

ハッシュマップを次のように定義しました

HashMap<ArrayList<Integer>, Integer> map = new HashMap<ArrayList<Integer>, Integer>();

したがって、キーは整数のリストで、値は整数です。

map.containsKey(lis2)は、指定されたキーの一致を見つけようとします。そのため、各キーでequalsメソッドが呼び出されます。キーは実際には整数のリストであるため、そのリストの各項目に対して equal メソッドが順番に呼び出されます。

そのため、出力は true です。

2 番目のリストの項目のいずれかを変更したり、項目の順序を変更したりすると、出力は false になります。

于 2013-10-29T07:25:09.670 に答える