3

次のようなプログラムがあるとします。

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 つの個別のオブジェクトを作成します」の場合。どうしてこんなことに?プールからの完全一致の検索が遅いためですか? そうである場合、文字列プールをある種のハッシュ テーブルなどのように実装することはできませんか?

4

3 に答える 3

6

プールは、ハッシュされたデータ構造として実装されます。Java は、検索を実行するかどうか、および非リテラル String オブジェクトを共有するかどうかの決定をプログラマーに任せます。String メソッドのintern()を参照してください。

于 2013-04-01T17:44:08.557 に答える
3

文字列をどこから読み取っているのかはまったく関係ありません。実際のところ、入力ストリームの実装では、ソースから読み取られたバイト データから新しい文字列が作成されます。しかし、これは実装クラスのソースコードを見ないとわかりません。一般に、ドキュメントに明示的に記載されていない限り、文字列がクラスによってインターンされていると想定しないでください。

于 2013-04-01T17:46:06.853 に答える