🟢 はじめに
Javaを学習していると、文字列の比較で == と equals() の違いにぶつかりますよね。
その中でひっそりと登場する intern() というメソッド。
「これ、一体何をしているの…?」と疑問に思ったことはありませんか?
今回は、Javaの文字列管理の仕組みを「オフィスとメモ用紙」に例えて、intern() メソッドの正体を分かりやすく解説します!
🏢 登場人物:Javaオフィスとメモ用紙
まず、Javaの世界を一つの「オフィス」だと想像してみてください。
このオフィスには、紙を節約するための 「共有掲示板(String Pool)」 があります。
" "(ダブルクォーテーション)で作った文字列: 自動的にこの「共有掲示板」にメモとして貼り出され、みんなでシェア(使い回し)します。
new String() で作った文字列: 「私は自分専用の新しい紙が欲しい!」という強い意志なので、共有掲示板は無視して、わざわざ新しいメモ用紙を用意します。
これを踏まえて、以下のコードを見てみましょう!
💻 サンプルコード:メモ用紙の比較実験
public class StringInternExample {
public static void main(String[] args) {
// 1. 普通に作成(共有掲示板に「Hello」というメモが貼られる)
String standardMemo = "Hello";
// 2. newを使って作成(わざわざ自分専用の「Hello」メモを作る)
String specialMemo = new String("Hello");
// 3. intern()の登場!(共有掲示板に同じ文字がないか探しに行く)
String internedMemo = specialMemo.intern();
// さて、同じメモ用紙(実体)を見ているでしょうか?
System.out.println("① standardMemo == specialMemo : " + (standardMemo == specialMemo));
System.out.println("② standardMemo == internedMemo: " + (standardMemo == internedMemo));
}
}
実行結果
① standardMemo == specialMemo : false
② standardMemo == internedMemo: true
🕵️♂️ なぜこの結果になるのか?(解説)
Javaの == は、「書いてある文字」ではなく「全く同じ1枚のメモ用紙(実体)を見ているか?」を判定します。
① standardMemo == specialMemo が false な理由
standardMemo は共有掲示板のエコなメモを見ていますが、specialMemo は new を使って作った「自分専用のメモ」を見ています。
書いてある文字は同じ「Hello」でも、見ている紙そのものが違うので、結果は false(違うよ!)になります。
② standardMemo == internedMemo が true な理由
ここで intern() の魔法がかかります!
intern() は、「自分の持っているメモの文字(Hello)と同じものが、共有掲示板にないかな〜?👀」と探しに行く機能を持っています。
-
specialMemo(自分専用のメモ)がintern()を実行する。 -
共有掲示板を探すと、
standardMemoが貼った「Hello」のメモを発見! -
「あ、あるじゃん!じゃあこっちの紙を見よう!」となり、
internedMemoは共有掲示板のメモを見るように切り替わります。
結果として、standardMemo と internedMemo は「全く同じ共有掲示板の1枚のメモ」を見るようになったため、true(同じだよ!)になるというわけです。
💡 まとめ
-
intern()メソッドを使うと、文字列の「共有掲示板(String Pool)」に同じ文字がないか探しに行く。 -
同じ文字があれば、新しく紙を作るのをやめて、掲示板のメモを使い回すようになる。
普段の開発で頻繁に使うメソッドではないと聞きますが、Javaが裏側でどうやってメモリ(紙)を節約しているのかを知ると、プログラミングが楽しくなるかもしれません。
同じように「intern()メソッドの使い方がいまいち分からない😫」と悩んでいる人の参考になれば幸いです🙌