如果 String 是一个不可变对象,那么是否可以将更改后的值恢复回来?我的意思是,如果有一个字符串变量
String str="Hello";
如果将其更改为
str="Hi!";
现在,我们知道它将创建两个字符串对象“Hello”和“Hi!” 目前 str 指向“嗨!”。所以我要问的是,是否可以将字符串“Hello”的引用 (前一个,而不是通过创建新的)分配给str,因为它存在于内存中的某处?
是的,你可以这么做。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 个字节。
你可以做
str = "Hello"
JVM 会尝试在String
Hello
其中String pool
查找,如果发现它会将您的变量重新分配str
给Hello
答案是肯定的,当一个String
被创建的时候被放到handled memory的字符串池中,这种情况下,JVM会搜索字符串池看是否已经存在等价的字符串。如果是,则返回对相同的引用。如果没有,则将其添加到字符串池并返回引用。所以可能会创建一个新对象,也可能不会。
当你这样做时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>
像以前值的历史记录或存档一样使用。
您的代码创建零个对象。所有字符串文字都是在类加载时创建的,在任何代码执行发生之前。
无论您在代码中何处使用相同的字符串字面量,都指的是同一个对象。因此很容易"Hello"
在任何时候再次引用您的字符串。
由于字符串 "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.