java字符串作为不可变对象
如果字符串是一个不可变的对象,那么是否可以恢复更改后的值? 我的意思是如果有一个字符串变量
String str="Hello";
如果改成
str="Hi!";
现在,我们知道它将创建两个字符串对象“Hello”和“Hi!”目前str指向“嗨!”。所以我要问的是,是否可以将字符串“Hello”(前一个,不是通过创建新的)的引用分配给str,因为它存在于内存中的某个地方
你可以在下面搜索框中键入要查询的问题!
如果字符串是一个不可变的对象,那么是否可以恢复更改后的值? 我的意思是如果有一个字符串变量
String str="Hello";
如果改成
str="Hi!";
现在,我们知道它将创建两个字符串对象“Hello”和“Hi!”目前str指向“嗨!”。所以我要问的是,是否可以将字符串“Hello”(前一个,不是通过创建新的)的引用分配给str,因为它存在于内存中的某个地方
# 1 楼答案
你能行
str = "Hello"
JVM试图在它的},如果它发现它将把变量
String pool
中查找String
{str
重新分配给Hello
# 2 楼答案
由于字符串“Hello”仍在字符串池中,并且将在那里停留一段时间,因此可以引用任何变量:
唯一不引用同一字符串的情况是i you do
# 3 楼答案
答案是肯定的,当一个
String
被创建并放置在处理过的内存字符串池中时,在这种情况下,JVM搜索字符串池以查看是否已经存在等效字符串。如果是,则返回对相同对象的引用。如果不是,则将其添加到字符串池并返回引用。因此,可以创建或不创建新对象# 4 楼答案
当您执行
str = "Hi";
操作时,str的第一个值将被覆盖,并且不会出现在RAM中。 如果要保留其值,需要将其存储在临时变量中:您还可以像使用以前值的历史记录或存档一样使用
Arraylist<String>
# 5 楼答案
是的,你能做到。Java使用字符串池。因此,如果你这样做:
str
现在将从一开始就指向原始的“abc”但是,如果使用
new
字符串,则可以通过调用String的intern
方法强制它们相同。此方法将确保返回的字符串位于内存中的共享字符串池中现在,
str1 == str2
,这意味着它们指向同一个字符串对象要回答是否可以撤消作业的问题:否。你的问题是关于字符串的,但同样的想法适用于所有东西
您可能认为使用字符串时情况有所不同,但事实并非如此。唯一的区别是字符串对象在内存中的某个位置,而int在内存中只有4个字节
# 6 楼答案
您的代码创建零个对象。所有字符串文本都是在类加载时创建的,在执行任何代码之前
在代码中使用相同字符串文字的地方,都引用同一个对象。因此,在任何时候再次引用
"Hello"
字符串都非常容易