2.5. java.util.AbstractSet。Set達(HashSetなど)の親クラス¶
AbstractSetは、Set達の親クラスです。なので、Set達はAbstractSetの子供です。
子供たちを知るには親(クラス)を見ないとわからないことがたくさんあります。
そこで、Set達の親クラスAbstractSetを見ていきたいと思います。
※ちなみに、Set達の中にはHashSet、LinkedHashSetなど、いくつもあります。
目次
2.5.1. クラス図へ変換¶
では、早速クラス図にしてみましょう。
UML変換くんを実行。
> touml .\java\util\AbstractSet.java -o d:\temp\
※java1.8コード
※「-o d:temp」はクラス図の出力先です。
2.5.2. 継承を眺めてみる¶
2.5.2.1. AbstractSet。親クラス。¶
2.5.2.1.1. AbstractCollectionを継承しています。¶
Collectionというのは、Setよりももっと幅の広い概念で、集めたもの集合のような意味になります。
なので、この意味に共通する処理を共有しています。つまりAbstractCollectionの処理を流用しています。
2.5.2.1.2. Setを実現しています。¶
Set関連のクラスは、このインタフェースを実現する設計になっています。
2.5.2.2. AbstractCollection。親の親クラス¶
2.5.2.2.1. Collectionを実現しています。¶
Collection関連クラスはこのインタフェースを実現することになっています。
2.5.4. メソッドを眺めてみる。¶
2.5.4.2. equals¶
+equals(o:Object):boolean
引数が自分と同じかチェックし同じならtrueを返します。
※引数oがSetの子供か、oが格納している要素が自分と同じものかなどを確認しています。
2.5.4.3. hashCode¶
+hashCode():int
自分のハッシュコードを取得します。
格納されている要素のハッシュコードを取得して、その合計を返していました。
※h += obj.hashCode();
2.5.5. まとめ¶
AbstractSetにはそれほど多くの機能は実装されていませんでした。
ちょっと面白いなと感じたのremoveAllメソッドのイテレーターの使い方でした。
for (Iterator<?> i = c.iterator(); i.hasNext(); )
modified |= remove(i.next());
こんな風に、forループを使ってイテレーターを回していました。
私は今まで以下のようにwhileループを使って書いていましたが、for文を使った方がシンプルに書けますね。
※変数iのスコープをfor内に限定できるので良いですね。
Iterator<?> i = c.iterator()
while (i.hasNext())
modified |= remove(i.next());
でも、さらに考えを進めると拡張for文(for each)を使った方がさらにシンプルになるのかも。
for (Iterator<?> i : c)
modified |= remove(i.next());