繁体   English   中英

字符串作为不可变对象

[英]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>

  1. 您的代码创建零个对象。 在执行任何代码之前,所有字符串文字均在类加载时创建。

  2. 无论在代码中使用相同的字符串文字的什么地方,都引用一个相同的对象。 因此,随时可以很容易地再次引用您的"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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM