HashMapが終わった瞬間。
下記の様にするとjava.lang.StackOverflowErrorが発生する。
Map m = new HashMap(); m.put(m, "1"); //←この瞬間、この”m”は終了した。 //エラー m.put("", "1"); //これもエラー m.remove(m); //これもエラー m.containsKey("1");
これがHashtableだと起きない。
Map m = new Hashtable(); m.put(m, "1"); m.put("", "1"); m.remove(m); m.containsKey("1");
たとえば、あるプログラムにおいて内部的にHashMapを使ってるとする。
それを取得して、取得したHashMapにそのHashMap自身を格納してやるだけでそのプログラムを終わらせる事ができます。・・・・なんてことは意味ないし危険なのでやめましょう。ちなみにシリアライズしたものは問題ないです。
この場合はMapの実装の中身をいちいちHashtableかHashMapかを確認した後で、Mapに対する操作を記述しなければなりません。ポリモーフィズムは変更に強くて、インターフェースだけ知っていればいいはずなのにわざわざ実装を調べないといけないのはどういうことなんですか!?
単に、HashMapの実装が悪いだけ!?