Javaは文字列プールを使用します。これは、string interningという概念の実装です。
コンピュータサイエンスでは、文字列インターンは、それぞれ異なる文字列値のコピーを1つだけ保存する方法であり、変更不可能でなければなりません。インターン文字列は、文字列の作成や保留に時間を要するという代償を払って、文字列処理タスクをより時間的または空間的に効率的に処理します。別個の値は、文字列プールに格納されます。
これは、すべての文字列に対して、その特定の文字列のコピーが文字列プールに追加されることを意味します。その正確な文字列を保持するすべての変数は、その文字列プール内のそのコピーを指します。彼らはプログラム内のリテラルをしているので、
文字列Hello.
、
、およびMy name is Kevin
は、文字列プールに追加されます。
String myString = "Hello.";
文字列プール内に既にある文字列Hello.
、を指す変数myString
開始。
myString += " ";
文字列Hello.
は(末尾に余分なスペースに注意)プールに追加されます。変数myString
はこれをポイントします。
myString += "My name is Kevin";
文字列Hello. My name is Kevin
がプールに追加されます。変数myString
はこれをポイントします。
変数によって参照されなくなったプール内の文字列are eligible for garbage collection、Hello.
(末尾にスペースを含む)はガベージコレクションできるようになりました。
出典
2016-07-09 10:43:47
SQB
あなたが参照し、実際のオブジェクトへの参照元の違いを誤解されています。連結すると、参照は新しく作成された文字列オブジェクトを指し示します。 –
_name_と呼ばれるものは、実際に_variable_と呼ばれています。オブジェクトと参照には名前はありません。変数は異なる時間に異なるオブジェクトを参照することができ、異なる変数は同じオブジェクトを参照することができます。これは_aliasing_と呼ばれます。 – Seelenvirtuose