12
String h = "hi";

ここでは、文字列 h を文字列リテラル hi に参照しています。JVM には文字列リテラルを格納するための文字列リテラル プールがあるため、文字列は不変なので再利用できます...

これreusable,の正確な意味は何ですか?について話しているのaddressですか?毎回同じアドレスから選ばれるということですか?

4

4 に答える 4

12

はい、物事を簡単にするために、同じアドレスから選択すると考えることができますが、より正確には、変数は同じ参照を保持しています。これは、JVM がオブジェクトの適切なメモリ アドレスにマッピングするときに使用する番号/objectID です(オブジェクトはメモリ内で移動できます)。ただし、同じ参照が引き続き使用されます)。

次のようなコードでテストできます。

String w1 = "word";
String w2 = "word";
String b = new String("word"); // explicitly created String (by `new` operator) 
                               // won't be placed in string pool automatically
System.out.println(w1 == w2);  // true  -> variables hold same reference
System.out.println(w1 == b);   // false -> variable hold different references,
                               // so they represent different objects
b = b.intern(); // checks if pool contains this string, if not puts this string in pool, 
                // then returns reference of string from pool and stores it in `b` variable
System.out.println(w1 == b);   // true  -> now b holds same reference as w1
于 2012-05-25T19:05:59.517 に答える
9

の場合

String h = "hi";
String i = "hi";
String j = new String("hi");

JDK のバージョンに応じて、コンパイラインターンと呼ばれるものを実行し、を表すバイト データの単一のインスタンスを作成し、"hi"それを変数参照間で再利用する場合があります。最新の仕様では、すべてのStringリテラルが Permanent Generation の String プールにインターンされます。

new最後のステートメントのようにキーワードを使用すると、まったく同じバイトの新しいインスタンスが別のオブジェクトとして作成されます。

実行時に作成された文字列オブジェクトは、呼び出されない限り、文字列プールにはありません。これは通常は必要なく、問題を引き起こす可能性があり、重大な利点はめったにありません。.intern()

h == i; // true
h == j; // false
j.intern();
h == j; // true
于 2012-05-25T18:49:53.990 に答える
5

つまり、20 個のオブジェクトが同じ文字列リテラルを使用している場合:

private String h = "hi";

実際、これらのオブジェクトはすべて、メモリ内の同じ String インスタンスを参照します。文字列は不変であるため、その内容を変更することは不可能であるため、問題ではありません。したがって、同じインスタンスをオブジェクト間で問題なく共有できます。

于 2012-05-25T18:49:58.563 に答える
4

プログラムの存続期間中に作成されたすべての を含むStringリテラル プールが JVM 内にあります。再利用可能とは、まったく同じ文字とエンコーディングでString別のオブジェクトを使用したい場合に、新しいオブジェクトが作成されないことを意味します。代わりに、参照は文字列プールに既に存在する を指します。これをインターンといいます。StringStringString

StringJava では s が不変であるため、これを行うことができます。

このようなことを行う理由は、新しいStringオブジェクトを作成するコストを回避するためです。

文字列リテラルプールとは何か、およびその仕組みの詳細については、http ://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 を参照してください。

また、この質問を見てください:自動文字列インターニングを使用しても、Java で `String s = new String("a new string");` を実行する必要はありませんか?

于 2012-05-25T18:50:24.343 に答える