次のようなプログラムがあるとします。
import java.io.*;
public class ReadString {
public static void main (String[] args) {
// prompt the user to enter their name
System.out.print("Enter your name: ");
// open up standard input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String userName = null;
String userNameCopy = null;
// read the username from the command-line; need to use try/catch with the
// readLine() method
try {
userName = br.readLine();
System.out.print("Enter your name once again: ");
userNameCopy = br.readLine();
} catch (IOException ioe) {
System.out.println("IO error trying to read your name!");
System.exit(1);
}
System.out.println("Thanks for the name, " + userName);
}
} // end of ReadString class
ここで、ユーザーがユーザー名を 2 回入力するuserName
と、userNameCopy
文字列は同じ値になります。文字列は不変であるため、Java コンパイラは 2 つの参照を持つメモリ オブジェクトを 1 つだけ使用するほどスマートでしょうか? それとも、この動作はプログラムにハードコードされた文字列リテラルに対してのみ予約されているのでしょうか?
答えが「いいえ、コンパイラはヒープ上に 2 つの個別のオブジェクトを作成します」の場合。どうしてこんなことに?プールからの完全一致の検索が遅いためですか? そうである場合、文字列プールをある種のハッシュ テーブルなどのように実装することはできませんか?