basyura's blog

あしたになったらほんきだす。

Map のキーに Map を使う

String をキーにして使う事ばっかりで Map をキーとして使えたっけなぁ・・・自信が全くない・・・で調査。

指定されたオブジェクトがこのマップと等しいかどうかを比較します。指定されたオブジェクトもマップであり、2 つの Map が同じマッピングを表している場合は true を返します。つまり、t1.entrySet().equals(t2.entrySet()) である場合、2 つのマップ t1 と t2 は同じマッピングを表します。これにより、Map インタフェースの実装が異なる場合でも、equals メソッドが正しく動作することが保証されます。

Map#equals

AbsctractMap.java のソースを見る。

public boolean equals(Object o) {
  if (o == this)
    return true;

  if (!(o instanceof Map))
    return false;
  Map<K,V> t = (Map<K,V>) o;
  if (t.size() != size())
    return false;

  try {
    Iterator<Entry<K,V>> i = entrySet().iterator();
    while (i.hasNext()) {
      Entry<K,V> e = i.next();
      K key = e.getKey();
      V value = e.getValue();
      if (value == null) {
        if (!(t.get(key)==null && t.containsKey(key)))
          return false;
      } else {
        if (!value.equals(t.get(key)))
          return false;
      }
    }
  } catch(ClassCastException unused) {
    return false;
  } catch(NullPointerException unused) {
    return false;
  }

  return true;
}
  • キーのインスタンスが同じ場合は true
  • キーが Map じゃ無い場合は false
  • キーの size が違う場合は false
  • キーのエントリを比較して全て同じ場合は true

てことで、

import java.util.*;
public class HashTest {
  public static void main(String args[]) {
    Map key = new HashMap();
    key.put("a","A");
    Map map = new HashMap();
    map.put(key , "AA");

    Map key2 = new HashMap();
    key2.put("a","A");

    System.out.println(map.get(key2));
    // => AA
  }
}

というふうに使える。