internメソッドの概要
先日Java Silverの学習を進めていた時にinternメソッドの問題で少し躓きました。
解説書を読みある程度まで理解が進んだのでメソッドの機能をまとめておこうと思います。
internメソッドとは
java.lang.Stringクラスに属するメソッドでコンスタントプールを含んだメモリ領域内の文字列を探し、同じ文字列が存在すれば同じ文字列を返すもの。
仮に同じ文字れるが見つからなければ新たに文字列を生成します。
例
String s1 = "Hello";
System.out.println(s1.intern());
出力結果
Hello
となります。
簡単に言うとString型で使いたい文字列が既に生成されているならそこの参照を使いまわす、といったイメージだと思います。
ここまでは同じ文字を返すだけだと思っていたのですが、このメソッドはあくまで「既に存在している文字列の参照」を返すものです。
例えばこのような問題
String s1 = new String("Hello");
String s2 = "Hello";
String s3 = s1.intern();
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s2 == s3);
出力結果
false
false
true
となります。
まず(s1 == s2)に関しては、
s1はnewキーワードによるインスタンス化が行われているため(ヒープ領域というクラス外の領域に文字列が保存される)、直接変数に文字列を代入したs2とは参照が違うため結果が「false」となります。
次に(s1 == s3)ですが、
s3は前述のとおり同じ文字列が既に使われているかを判断します。
このクラスでは「Hello」という文字列はまだ使われていません。(s1はヒープ領域に保存されているため見つけることができない)
そのため、s3には新しく生成された文字列「Hello」が代入されることになります。
よって結果は「false」となります。
最後に(s2 == s3)、
ここではinternメソッドを使用しています。
この行の動きを説明すると「s1と同じ文字列をクラス内の領域で探し、同じものが既にあればその文字列の参照をs3に代入する」と言えます。
s2にすでに「Hello」という文字列が代入されている(クラスのメモリ領域に保存されている)ためinternメソッドはメモリから「Hello」という文字列を見つけ出しそれをs3へと代入します。
つまりこの結果は「true」となります。
まとめ
internメソッドは同クラスのメモリ領域に同じ文字列が無いか探しに行くメソッド。
同じものが存在していればその文字列の「参照」を返す点に注意。
あくまで参照を返しているため同じ値ではないことも注意。