質問: 本で読んだのですが、Stringクラスは特例としてインスタンスを生成しなくても使えると書いてあります。 intやfloatやboolean型もnewしなくても使えますよね? なぜ使えるのですか?
回答: swordoneさんの回答の補足として・・・ > > Stringクラスは特例としてインスタンスを生成しなくても使えると書いてあります。 > > > その本は、**間違ったことが書いてある**ようですね。。。(質問者さんの言う通りなら) javadocにもきちんと > > Stringクラスは文字列を表します。Javaプログラム内の"abc"などのリテラル文字列はすべて、このクラスのインスタンスとして実行されます。 > > > インスタンスとして実行されると書いてあります。 newをしなくても使えるなら、まぁStringに限らずインスタンスを生成するのにnewを使わなくてもできます。 ちなみに文字列リテラルは String#internにあるとおりです。 > > すべてのリテラル文字列および文字列値定数式が保持されます。文字列リテラルは、『Java(tm)言語仕様』のセクション3.10.5で定義されています。 > > > よく文字列はequalsで比較しないといけませんとありますが、 ※これ自体は、その通りなので以下を見ても`==で比較してはダメです` 実際に==で比較してもtrueになります。 Stringをnewしてはいけない理由は同じ文字列を違う領域に作成する=メモリの無駄使い というのもわかると思います。 ``` String abc = "abc"; String abc2 = "abc"; String abcNew = new String("abc"); String abcIntern = new String("abc").intern(); String abcIntern2 = "a" + "b" + "c"; System.out.println(abc == abcNew); // false System.out.println(abc == abcIntern); // true System.out.println(abc == abcIntern2); // true System.out.println(abc == abc2); // true ```