String h = "hi";
ここでは、文字列 h を文字列リテラル hi に参照しています。JVM には文字列リテラルを格納するための文字列リテラル プールがあるため、文字列は不変なので再利用できます...
これreusable,
の正確な意味は何ですか?について話しているのaddress
ですか?毎回同じアドレスから選ばれるということですか?
String h = "hi";
ここでは、文字列 h を文字列リテラル hi に参照しています。JVM には文字列リテラルを格納するための文字列リテラル プールがあるため、文字列は不変なので再利用できます...
これreusable,
の正確な意味は何ですか?について話しているのaddress
ですか?毎回同じアドレスから選ばれるということですか?
はい、物事を簡単にするために、同じアドレスから選択すると考えることができますが、より正確には、変数は同じ参照を保持しています。これは、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
の場合
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
つまり、20 個のオブジェクトが同じ文字列リテラルを使用している場合:
private String h = "hi";
実際、これらのオブジェクトはすべて、メモリ内の同じ String インスタンスを参照します。文字列は不変であるため、その内容を変更することは不可能であるため、問題ではありません。したがって、同じインスタンスをオブジェクト間で問題なく共有できます。
プログラムの存続期間中に作成されたすべての を含むString
リテラル プールが JVM 内にあります。再利用可能とは、まったく同じ文字とエンコーディングでString
別のオブジェクトを使用したい場合に、新しいオブジェクトが作成されないことを意味します。代わりに、参照は文字列プールに既に存在する を指します。これをインターンといいます。String
String
String
String
Java では s が不変であるため、これを行うことができます。
このようなことを行う理由は、新しいString
オブジェクトを作成するコストを回避するためです。
文字列リテラルプールとは何か、およびその仕組みの詳細については、http ://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 を参照してください。
また、この質問を見てください:自動文字列インターニングを使用しても、Java で `String s = new String("a new string");` を実行する必要はありませんか?