0

如果 String 是一个不可变对象,那么是否可以将更改后的值恢复回来?我的意思是,如果有一个字符串变量

String str="Hello";

如果将其更改为

str="Hi!";

现在,我们知道它将创建两个字符串对象“Hello”和“Hi!” 目前 str 指向“嗨!”。所以我要问的是,是否可以将字符串“Hello”的引用 (前一个,而不是通过创建新的)分配给str,因为它存在于内存中的某处?

4

6 回答 6

1

是的,你可以这么做。Java 使用字符串池。所以如果你这样做:

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

str现在将从头开始指向原始的“abc”。

但是,如果你使用Strings,你可以通过调用Stringnew的方法来强制它们相同。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;

您可能认为使用字符串时会有所不同,但事实并非如此。唯一的区别是 String对象 在内存中的某个地方,而 int 在内存中只有 4 个字节。

于 2013-09-25T19:57:54.267 回答
1

你可以做

str = "Hello"

JVM 会尝试在String Hello其中String pool查找,如果发现它会将您的变量重新分配strHello

于 2013-09-25T19:58:16.933 回答
1

答案是肯定的,当一个String被创建的时候被放到handled memory的字符串池中,这种情况下,JVM会搜索字符串池看是否已经存在等价的字符串。如果是,则返回对相同的引用。如果没有,则将其添加到字符串池并返回引用。所以可能会创建一个新对象,也可能不会。

于 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 回答
0
  1. 您的代码创建零个对象。所有字符串文字都是在类加载时创建的,在任何代码执行发生之前。

  2. 无论您在代码中何处使用相同的字符串字面量,都指的是同一个对象。因此很容易"Hello"在任何时候再次引用您的字符串。

于 2013-09-25T19:58:02.757 回答
0

由于字符串 "Hello" 仍在字符串池中,并且会在那里一段时间,您可以引用任何变量:

str = "Hello";
str = "Hi";
String s = "Hello"; //its the same Hello as the first one

您不会引用相同字符串的唯一情况是 i 您这样做

String s = New String ("Hello"); //this will be a different "Hello" from the first one.
于 2013-09-25T20:02:15.290 回答