0

String が不変オブジェクトの場合、変更された値を元に戻すことは可能ですか? つまり、文字列変数が 1 つある場合

String str="Hello";

そして、それがに変更された場合

str="Hi!";

これで、「Hello」と「Hi!」という 2 つの文字列オブジェクトが作成されることがわかりました。現在、str ポイントは「Hi!」です。だから私が求めている のは、メモリのどこかに存在するため、文字列「Hello」 (新しいものを作成するのではなく、前のもの) の参照strに割り当てることは可能ですか?

4

6 に答える 6

1

答えはイエスです。Stringが作成されると、処理されるメモリ文字列プールに配置されます。この場合、JVM は文字列プールを検索して、同等の文字列が既に存在するかどうかを確認します。はいの場合、same への参照を返します。そうでない場合は、文字列プールに追加して参照を返します。したがって、新しいオブジェクトが作成される場合と作成されない場合があります。

于 2013-09-25T20:01:46.320 に答える
1

するとstr = "Hi";、str の最初の値が上書きされ、RAM に存在しなくなります。その値を保持したい場合は、一時変数に保存する必要があります。

String str = "Hello";
String temp = str;//store Hello in temporary variable
str = "Hi!" ;
str = temp ; //first value is back

Arraylist<String>また、以前の値の履歴またはアーカイブのように使用できます。

于 2013-09-25T20:01:49.643 に答える
1

できるよ

str = "Hello"

JVM はString HelloString pool変数strHello

于 2013-09-25T19:58:16.933 に答える
1

はい、できます。Java は文字列プールを使用します。したがって、次のようにします。

String str = "abc";
str = "def";
str = "abc";

str最初から元の「abc」を指すようになりました。

ただし、String を使用する場合は、String のメソッドをnew呼び出すことで強制的に同じにすることができます。internこのメソッドは、返された文字列がメモリ内の共有文字列プールにあることを保証します。

String str1 = new String("abc").intern();
String str2 = new String("abc").intern();

これはstr1 == str2、同じ String オブジェクトを指していることを意味します。


割り当てを元に戻すことができるかどうかという質問に答えるには:いいえ. あなたの質問は文字列に関するものでしたが、同じ考えがすべてに当てはまります。

int k = 4;
k = 9;
// now reverting to the "previous value" is impossible without hardcoding 4 again
k = 4;

Strings を使っていると違うと思うかもしれませんが、そうではありません。唯一の違いは、Stringオブジェクト はメモリ内のどこかにあり、int はメモリ内で 4 バイトしかないことです。

于 2013-09-25T19:57:54.267 に答える