HashMap#put のソースを読む
ちょっと疑問があったので調べていたのだが、ソースも公開されている事だしちょっとずつ Java のソースを見ていこうと思う。仕事では JDK1.4 だけど読むのは JDK5.0 にする。今更ながら結構違うのよね。ジェネリックスが登場してソースコードも結構修正されてる。
第一弾は HashMp#put
public V put(K key, V value) { K k = maskNull(key); int hash = hash(k); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { if (e.hash == hash && eq(k, e.key)) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, k, value, i); return null; }
まず、K とか V とかってなんだよ(笑) Object じゃないのかよ。理解不能だがこれは後で調べる。
気になったのが、
return oldValue
put したら一つ前の値が返ってくるんだよ (^^; 今まで実装で困ったことは無いしこれをあてにしたことも無いから実害は無いと思うけど、、、ちょっと微妙だなぁ、、、普通に考えれば今突っ込んだ値を返してメソッドチェーンでつなぐんじゃね?
とりあえずテストコードを書いてみた。
Map map = new HashMap(); for(int i = 0 ; i < 9 ; i++) { System.out.println("put " + i + " -> " + map.put("KEY" , i + "")); }
実行結果
put 0 -> null put 1 -> 0 put 2 -> 1 put 3 -> 2 put 4 -> 3 put 5 -> 4 put 6 -> 5 put 7 -> 6 put 8 -> 7
一つ前の値が返ってきてるいるのが分かる。そして、JavaDoc を見ていて気がついた。
@return previous value associated with specified key
ちゃんと「キーに関連する前の値が返される」と書かれている。日本語訳されている JavaDoc を見てみる
指定されたキーに関連した値
HashMap#put JDK5
いや、誤訳じゃね?
気になったので、JDK6 の API も見てみた。
key に以前に関連付けられていた値
HashMap#put JDK6
直ってる!
安心した。