絶対領域をおかしてしまうとどうなるのか(゜ー゜)。
先の方式を使うと、Stringオブジェクトを書き換え可能になります。次のメソッドを定義します。
/* strToの中身をstrFromにする。 ただし、短い文字列に変更しようとすると ArrayIndexOutOfBoundsException になるので気をつけて。 */ static void changeString(String strTo, String strFrom){ Class classString = strTo.getClass(); Field charField = null; try{ charField = classString.getDeclaredField("value"); }catch(NoSuchFieldException e){ e.printStackTrace(); System.exit(-1); } charField.setAccessible(true); try{ charField.set(strTo, strFrom.toCharArray()); }catch(IllegalAccessException e){ e.printStackTrace(); System.exit(-1); } return; }
利用例を見てみましょう。
String str = "hoge"; System.out.println(str); changeString(str, "test"); System.out.println(str); /* 実行結果: hoge test */
でも、これだけではありません。次のコードはもっと大変なことになってます。
changeString("Hiratara", "Horiemon"); /* さて、自己紹介してみる。 */ System.out.print("My name is '"); System.out.print("Hiratara"); System.out.print("'\n"); /* 実行結果: My name is 'Horiemon' */
常識では考えられませんな。。。
追記。Mapによる実験もしてみましたが、あまり面白い結果にはなりませんでした。
と言うのは、Stringの場合、文字列の中身を強引に変えてもhashCode()は変化しないからです。これは、論理的に同値のオブジェクトについてシングルトンになるように実装されてるからだと思います。