//C++
cout << "Hello, World" << endl; //(1)
//Java
System.out.println("Hello, World"); //(2)
(1)のコードはC++で書かれたものである。C++では二重引用符で囲まれたものは処理系依存であるが基本的にconst char*として扱われる。(2)はJavaで書かれたもので、Javaでは二重引用符で囲まれたものはStringオブジェクトとして扱われる。ここが大きな差である。なので以下のようなコードも文法上全く問題無いのである。
System.out.println("Hello, World".length()); //Stringメソッドのlength()を呼び出している
実行結果
12
次に+=演算子等の扱いについて。
//C++
string str("Hello, ");
str += "World"; //(3)
//Java
String str = new String("Hello, ");
str += "World"; //(4)
(3)ではconst char*型である右辺値をstring型オブジェクトである左辺値strでオーバーロードされた+=演算子にてstrのデータを直接書き換えているが、(4)では、String型である右辺値をString型である左辺値の末端に付け加えたオブジェクトを新たに生成し、それを左辺値に代入を行っているのである。これが意図することは、Javaにてforやwhile等でString型のオブジェクトに対して新たな文字列を逐次付け加える処理を行った場合、その都度メモリに新しいオブジェクトが生成されることを意図している。Javaではガーベージコレクタを実装しているので、参照が無効となった時点でメモリが解放されることになっているが、パフォーマンス的に言うならよろしくない。そこでJavaでは文字列の付け加えを行う場合にはStringBufferクラスの使用を推奨している。
もう一つとして、C++では文字列の終端文字として\0を原則としていたが、Javaでは基本的に終端文字は存在しないのである。これは終端文字の役割を考えれば明らかであるが、標準の文字列としてStringオブジェクトを扱うJavaには、そもそも終端文字が必要ないのである。