3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

HashMap#putAll()の挙動がJava7とJava8で異なる

Last updated at Posted at 2019-10-08

こんなコードがあった。

HashMapを継承したカスタムHashMapクラス
@Override
public Object put(Object key, Object value) {
	// キーを小文字にする
	return super.put(key.toString().toLowerCase(), value);
}
カスタムHashMapを使用しているコード
CustomHashMap map = new CustomHashMap();
map.putAll(valueMap); // Java7ではキーがすべて小文字になる

Java7からJava8に上げると、mapのキーが小文字にならずに、今まで通りの挙動をしなくなった。

HashMapのコードを読んだところ、

  • Java7では、putAll()からput()を呼び出している
  • Java8では、putAll()からput()を呼び出していない

ことが原因と判明。つまり、Overrideしたputメソッドを呼び出していないためである。
putAllはOverrideしていなかったので、Java7ではたまたま動いていた、と考えるべきか。
(Java7の実装を読んでいたのかも知れないが。)

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?