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

直ってる!
安心した。