2.3. java.util.AbstractMap。Map仲間の親クラスです。

AbstractMap。Map仲間の親クラスです。

Map仲間のクラスはこれを継承しています。

Mapには次のようにクラスたちがいます。

HashMap、TreeMap...

2.3.1. クラス図へ変換

では、早速クラス図にしてみましょう。

UML変換くんを実行。

> touml .\java\util\AbstractMap.java -o d:\temp

※java1.8コード

※「-o d:temp」はクラス図の出力先です。

2.3.1.1. パッケージ図

image001.jpg

パッケージ図はこれです。

AbstractMapはutil内にあり、関連するpackageはこんな感じでした。

2.3.1.2. クラス図

../_images/java.util.AbstractMap.svg

元の図は大きいので、これを小さく切り取って見ていきます。

2.3.2. 継承を眺めてみる

2.3.2.1. Mapインタフェースを継承。

image002.jpg

MapはMap関連のクラスはこれを実現しないといけません。実現しないとMap仲間から除外されてしまいます。

仲間から除外されるとOOPの利益のポリモーフィズム(多態性)が使えず不便になってしまいます。

OOP:オブジェクト指向プログラミング(object-oriented programming)

2.3.3. フィールドを眺めてみる

image003.jpg

2.3.3.1. keySet

~keySet:Set<K>{volatile}{transient}

keySet( )メソッド内で使われている。コールされたときにkeySetに生成したAbstractSet<K>※を保持する。

※:オーバーライドしたもの

※興味深い実装をしています。

2.3.3.2. values

~values:Collection<V>{volatile}{transient}

values ( )メソッド内で使われている。コールされたときにvaluesに生成したAbstractCollection<V>※を保持する。

※:オーバーライドしたもの

※興味深い実装をしています。

2.3.4. メソッドを眺めてみる

2.3.4.1. コンストラクタ

#AbstractMap():void

処理はありませんでした。

2.3.4.2. size

+size():int
+isEmpty():boolean

sizeは保持している要素数を返します。

isEmptyはsizeが0かを判定します。

2.3.4.3. containsValue

+containsValue(value:Object):boolean
+containsKey(key:Object):boolean

containsValueは引数valueを保持している要素の値に含まれているか一つづつチェックします。

containsKeyは引数keyを保持している要素のキーに含まれているか一つづつチェックします。

※whileループで回しています。

2.3.4.4. get

+get(key:Object):V

引数keyを保持している要素のキーと同じか一つづつチェックして、同じ場合対応する値を返します。

※whileループで回しています。

2.3.4.5. put

+put(key:K,value:V):V

引数keyとvalueを要素として追加します。

※ここでは、例外UnsupportedOperationExceptionを投げます。

※これは、子クラスでオーバーライドする必要があります。

2.3.4.6. remove

+remove(key:Object):V

引数keyを保持している要素から一つ探して削除します。

2.3.4.7. putAll

+putAll(m:Map<?extends K,?extends V>):void

引数mのMap集合を、要素にまとめて追加します。

2.3.4.8. clear

+clear():void

保持しているすべての要素を削除します。

2.3.4.9. keySet

+keySet():Set<K>
+values():Collection<V>
+entrySet():Set<Entry<K,V>>

keySetは保持しているキーの集合をSet<K>にして返却します。

valuesは保持している値の集合をCollection <K>にして返却します。

entrySetは保持しているキーと値のペアの集合をSet<Entry<K,V>>にして返却します。

2.3.4.10. equals

+equals(o:Object):boolean

equalsは引数oと自分を比較して同じかどうか判定します。

2.3.4.11. hashCode

+hashCode():int

自分のインスタンスをハッシュ値にして返却します。

ここでは、保持している各要素のハッシュ値の合計を返却していました。

2.3.4.12. toString

+toString():String

自分のインスタンスを文字列として返却します。

ここでは、要素のキーと値の一覧を文字列にしています。

2.3.4.13. clone

#clone():Object

自分のクローン(コピー)を作成して返します。

2.3.4.14. eq

-eq(o1:Object,o2:Object):boolean

staticメソッドで引数o1とo2を比較して同じかどうか判定します。

2.3.5. 内部クラス

2.3.5.1. SimpleEntry。キーと値をペアで持つクラス。

image004.jpg

SimpleEntryキーと値をペアで持つクラス。

※Simple:シンプルな+Entry:登録用データ(この場合キーと値のペアデータ)

-key:K{readOnly}
-value:V

フィールドを見ると、keyのみ{readOnly}となっています。

※{readOnly}はjavaのfinalのことです。

2.3.5.2. SimpleImmutableEntry。キーと値をペアで持つクラス(不変)。

image005.jpg

SimpleImmutableEntryはキーと値をペアで持つクラス。

※Simple:シンプルな+Immutable:不変の+Entry:登録用データ(この場合キーと値のペアデータ)

-key:K{readOnly}
-value:V{readOnly}

フィールドを見ると、key、value両方が{readOnly}となっています。

※{readOnly}はjavaのfinalのことです。

2.3.6. まとめ

AbstractMapはMap仲間の親クラスです。Map仲間のクラスはこれを継承しています。

ここに書かれている実装はシンプルでした。キーに対応する値をループ文で処理するようなものばかりでした。

実際にこれを継承する子クラスのHashMapなどは、この実装をオーバーライドしてハッシュを使って高速化するのでしょう。

あくまでは、このクラスは基本的なループ処理による実装でした。