最近我参加了一次采访,他们问了这个我无法回答的问题。
初始化时内存中会发生什么
String str = "abc";
String str1 = "abc";
String str = "xyz";
答案 0 :(得分:2)
将其视为像这样,
首次使用" abc" 初始化变量Str
,然后字面值 " abc&# 34; 在字符串池中获取内存,因此变量Str
可以引用此" abc" 。
Str
--------------------------------> abc
On Second Step,以类似方式对 String Pool 中的同一文字进行另一个变量引用。
Str
--------------------------------> abc
< ------------------------------- Str1
在最后一步中,如果考虑String Str
,则Error
会出现如下情况: -
variable Str is already defined
相反,我将Str = "xyz"
执行此操作New
文字将获取字符串池中的内存,Str
之前的引用将被删除并且新参考将被分配。
Str
----------- X -------------> abc
< ----------------------- Str1
Str
--------------------------> xyz
最后我们会得到这个,并且在字符串池
中有2个文字即abc
和xyz
Str
--------------------------> xyz
和Str1
--------------------------> abc
答案 1 :(得分:1)
假设第三个变量应该有不同的名称:
在编译时,相同的"abc"
字符串将与"xyz"
一起被拉入字符串池。因此,最终会有两个String变量指向同一个"abc"
实例,另一个指向"xyz"
。
答案 2 :(得分:0)
将在String常量池(SCP)中创建一个字符串对象,其内容为
"abc"
1. str
引用将指向该对象。
创建第二个对象jvm时会检查是否相同" abc" SCP中是否提供内容 在你的情况下已经可用
2 str1
将指向现有对象
3. String str="xyz"
已str
再次指向abc
内容对象我们分配给xyz
Code will not compile as you are using duplicate `str` variable