Setの実装は、ほとんど中身が空っぽ
Java の HashSet のアルゴリズムを確認しようとクラスの中身を見てびっくり。
HashSet は、処理のほとんどを HashMap へ委譲するだけという超簡単なアルゴリズムでした。
コンストラクタはこんな感じ。
public HashSet() { map = new HashMap<E,Object>(); }
メソッドの処理は?
public boolean add(E e) { return map.put(e, PRESENT)==null; }
引数を Key、PRESENT というダミーのオブジェクトを Value として、Map に要素を追加していました。
contains や iterator といったメソッドも、そのまま Map へ処理を委譲しているだけになっていました。
他の実装は?
他の TreeSet や EnumSet も、対になる TreeMap や EnumMap へ処理を委譲していました。
HashMap 同様に、どのクラスも中身はほとんど空っぽで、ソースの半分以上がAPIの記述になっていました*1。
委譲のお手本
これは、委譲のいいお手本だと思います。
ここまで何もしていないクラスっていうのは、読んでいてすごく新鮮でした。
ちなみに、このような実装になっていることは、APIにさりげなく書いてありました*2。
このクラスは、ハッシュテーブル (実際には HashMap のインスタンス) に連動し、Set インタフェースを実装します。
Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle