[英]String object is immutable but reference variable is mutable. What does that mean?
[英]String as immutable object
如果String是一个不可变的对象,那么是否可以将更改后的值还原回去? 我的意思是,如果有一个字符串变量
String str="Hello";
如果它更改为
str="Hi!";
现在,我们知道它将创建两个字符串对象“ Hello”和“ Hi!”。 并且目前str指向“嗨!”。 因此,我要问的是,是否有可能将字符串“ Hello” (上一个,而不是通过创建新字符串)的引用分配给str,因为它存在于内存中的某个位置?
是的,你可以这么做。 Java使用字符串池。 因此,如果您这样做:
String str = "abc";
str = "def";
str = "abc";
str
现在将从头开始指向原始的“ abc”。
但是,如果使用new
字符串,则可以通过调用String的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 pool
查找String
Hello
,如果它发现它将把您的变量str
重新分配给Hello
答案是肯定的,将创建的String
放在已处理的内存字符串池中时,在这种情况下,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
您不会引用相同字符串的唯一情况是
String s = New String ("Hello"); //this will be a different "Hello" from the first one.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.