2.2. java.util.Map。要素にキーワードをつけ便利にする。

Mapは集合を扱うクラスのインタフェースです。

ですので、使うときにはこのクラスを実現した子クラス(HashMapなど)を使います。

Mapの特徴としては、集合の要素にキーをつけて、キーから簡単に要素を取得できたりすることです。

mapの意味は「地図、天体図、星座図、図解、図表」です。

つまり、要素にキーをつけた表を作るイメージです。

キー

要素(鳴き声)

ガオー

ヒッヒーン

ワンワン

2.2.1. クラス図へ変換

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

UML変換くんを実行。

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

※java1.8コード

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

2.2.1.1. パッケージ図

../_images/java.util.Map.image001.jpg

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

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

2.2.1.2. クラス図

../_images/java.util.Map.svg

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

2.2.2. 継承を眺めてみる

../_images/java.util.Map.image002.jpg

Mapは何も継承していません。

2.2.3. フィールドを見てみる

../_images/java.util.Map.image003.jpg

Mapにフィールはありませんでした。

2.2.4. メソッドを眺めてみる。

2.2.4.1. size

~size():int
~isEmpty():boolean

抽象メソッドなので実装はありません。子クラスがオーバーライドします。

seizeは集合の要素の数を返し、isEmptyは集合の要素が空かどうかを返します。

2.2.4.2. containsKey

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

抽象メソッドなので実装はありません。子クラスがオーバーライドします。

containsKeyはkeyがキーの要素に含まれるかをチェックします。

containsValueはvalueが値の要素に含まれるかをチェックします。

2.2.4.3. get

~get(key:Object):V

抽象メソッドなので実装はありません。子クラスがオーバーライドします。

引数keyより、キーの要素に対応する値の要素を取得します。

2.2.4.4. put

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

抽象メソッドなので実装はありません。子クラスがオーバーライドします。

要素を追加する。引数keyにキー要素、引数valueに値要素をセットして追加します。

2.2.4.5. remove

~remove(key:Object):V

抽象メソッドなので実装はありません。子クラスがオーバーライドします。

引数keyをキー要素から探して削除します。

2.2.4.6. putAll

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

抽象メソッドなので実装はありません。子クラスがオーバーライドします。

引数mのMap集合をすべて追加します。

2.2.4.7. clear

~clear():void

抽象メソッドなので実装はありません。子クラスがオーバーライドします。

要素を全部削除します。

2.2.4.8. keySet

~keySet():Set<K>
~values():Collection<V>

抽象メソッドなので実装はありません。子クラスがオーバーライドします。

内部で持っている、キー(key)の集合、値(values)の集合を取得します。

2.2.4.9. entrySet

~entrySet():Set<Map.Entry<K,V>>

抽象メソッドなので実装はありません。子クラスがオーバーライドします。

エントリセットを取得します。

エントリセット(entrySet):データ登録するものの集合。
ここではMapの要素であるキーと値のペア集合です。
(entry:入ること、入場、加入、記入、登録 + Set:集合)
※これ、最初はentryの意味が広くて戸惑いました。
※HashMapの処理を確認して、やっとentryの意味がわかりました。

2.2.4.10. equals

~equals(o:Object):boolean
~hashCode():int

抽象メソッドなので実装はありません。子クラスがオーバーライドします。

equalsは引数oと自分自身のインスタンスが同じかをチェックします。

hashCodeは自分自身のインスタンスからハッシュ値を計算して返します。
※equalsの中で、判定に使われます。

2.2.4.11. getOrDefault

~getOrDefault(key:Object,defaultValue:V):V

これはdefaultメソッドで、インタフェースでも実装があります。

引数keyがあれば、それに対応する値を返します。なければ、引数Vをそのまま返します。

※「getOrDefault」はネーミングが面白いですね。そのまま動作を表していました。
※getOrDefault:値を取得(get)するか(Or)、デファオルト値(Default)を返す。

2.2.4.12. forEach

~forEach(action:BiConsumer<?super K,?super V>):void

これはdefaultメソッドで、インタフェースでも実装があります。

メソッドとしてfor eachのループを実行します。 処理内容は引数actionに関数オブジェクトを書いてそれをセットします。

2.2.4.13. replaceAll

~replaceAll(function:BiFunction<?super K,?super V,?extends V>):void

これはdefaultメソッドで、インタフェースでも実装があります。

引数functionの関数オブジェクトの処理を使って、要素の置換をします。

関数オブジェクトBiFunctionをオーバーライドして処理を実装します。

2.2.4.14. putIfAbsent

~putIfAbsent(key:K,value:V):V

これはdefaultメソッドで、インタフェースでも実装があります。

引数keyに対応する、箇所がまだ空いていたらvalueを追加します。

2.2.4.15. remove

~remove(key:Object,value:Object):boolean

これはdefaultメソッドで、インタフェースでも実装があります。

引数keyに対応する値が引数valueと同じ場合は、削除します。

2.2.4.16. replace

~replace(key:K,oldValue:V,newValue:V):boolean
~replace(key:K,value:V):V

これはdefaultメソッドで、インタフェースでも実装があります。

引数keyで取得した値があれば引数valueで置き換えます。

※引数oldValueは、引数keyで取得した値した値と比較して同じ場合にvalueと置き換えます。

2.2.4.17. computeIfAbsent

~computeIfAbsent(key:K,mappingFunction:Function<?super K,?extends V>):V
~computeIfPresent(key:K,remappingFunction:BiFunction<?super K,?super V,?extends V>):V
~compute(key:K,remappingFunction:BiFunction<?super K,?super V,?extends V>):V

これはdefaultメソッドで、インタフェースでも実装があります。

computeXXX関連は関数オブジェクトで処理した結果を値として要素に加えます。
※compute:計算する
「computeIfAbsent」は引数keyで取得した値が空だったら、引数mappingFunctionでセットした関数オブジェクトで処理した結果を値として追加します。
※Absent:欠けている
「computeIfPresent」は引数keyで取得した値が既にあれば、引数remappingFunctionでセットした関数オブジェクトで処理した結果を値として置き換えます。
※Present:既にある
「compute」は引数keyで取得した値を引数remappingFunctionでセットした関数オブジェクトで処理し、結果を値として置き換えます。
※ただし結果がnullの場合はその要素を削除しています。(remove(key);)

2.2.4.18. merge

~merge(key:K,value:V,remappingFunction:BiFunction<?super V,?super V,?extends V>):V

これはdefaultメソッドで、インタフェースでも実装があります。

引数keyで取得した値と、引数valueを引数remappingFunctionでセットした関数オブジェクトでマージして置き換えます。

2.2.5. 内部クラス

2.2.5.1. Entry。キーと値をペアにします。

../_images/java.util.Map.image004.jpg

Mapのキーと値のペアを扱うためのインタフェースです。

MapのentrySetメソッドの戻り値に使っています。
※~entrySet():Set<Map.Entry<K,V>>

2.2.6. まとめ

Mapは集合を扱うクラスなので、追加put、削除remove、取得getなど一連の操作がまとまっていました。

眺めていて気づいたのですが、要素を加工できる機能をかなり持っていました。
マージ(merge)とか、計算(compute)とかです。

連想配列としてだけではない、別の使い方がありそうです。