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