String Poolとは?


この効果javaという本の章で、偶然「不要なオブジェクトの生成を避ける」という項目が現れた.
「仮想マシンで同じ文字列文字を使用するすべてのコードが同じオブジェクトを再利用していることを確認します.」こんな文
「JVMの他のコード(変数)間でStringメモリを共有するということですか?」たまたまString Poolという概念を聞いて

String Pool


String PoolはString文字列が存在する領域(JVM Hip Memoryに存在する)であり、以下のコードは同じ文字列内容を割り当てるが、メモリに割り当てる方法が異なり、開発者に混乱をもたらす場合がある.
String value1 = “value”;
String value2 = new String(“value”);
==比較は同じメモリアドレスを参照するかどうかを比較するので、上の文字列==を比較するとfalse,valueが当然表示されます.equals(value 2)構文を用いてtrue値を得ることはよく知られている.
ここにもう一つ面白い内容を追加します.
String value1 = “value”;
String value2 = “value”;
==で比較すると、上記のコードはfalseを返します.
結果はtrueです.
なぜtrueの結果が出たのでしょうか.

画像ソース:https://itzone.com.vn/en/article/what-is-string-pool/]
△これは理解に役立つ画像です.
この点を理解するには、Stringメモリがどのように割り当てられているかを理解する必要があります.
まず、文字列を直接処理する方法について説明します.
String value 1=「value」という文字列を直接置き換える方法は、JVMメモリのスタック領域でString Pool領域に割り当てることです.String Pool領域に割り当てると、コード実行時にString Poolに対応する同じ文字列が既に存在するため、既存のvalueという文字列が再利用されます.
2つ目の問題はnew演算子で文字列を割り当てる方法です.
String value 2=new String(「value」)これはnew演算子でオブジェクトを割り当てるコードであるため、String文字列を指定してもString poolを使用せずにJVMメモリスタック領域に直接割り当てることができる.したがって、hip領域にアドレス値を割り当てると、常に新しいアドレス値が参照されます.
上記の2つの要因を考慮すると、次のコードがtrue値を返す理由がわかります.
文字列比較演算はequalsで行わなければならないと学校で言っていましたが...
実际にはそうでもないですね…はは…新しい情报を得ましたははは