Java 访谈:当我初始化字符串str=”;美国广播公司;;字符串str1=&x201D;美国广播公司;;字符串str=”;xyz&x201D;

Java 访谈:当我初始化字符串str=”;美国广播公司;;字符串str1=&x201D;美国广播公司;;字符串str=”;xyz&x201D;,java,string,memory,Java,String,Memory,最近我在那里参加了一次采访,他们问了我无法回答的问题 初始化时内存中会发生什么 String str = "abc"; String str1 = "abc"; String str = "xyz"; 假设第三个变量应具有不同的名称: 在编译时,相同的“abc”字符串将与“xyz”一起拉入字符串池。因此,您将得到两个字符串变量,它们指向同一个“abc”实例,一个指向“xyz”,将在字符串常量池(SCP)中创建一个包含内容的字符串对象 "abc" 1.strreference将指向该对象

最近我在那里参加了一次采访,他们问了我无法回答的问题

初始化时内存中会发生什么

String str = "abc"; 
String str1 = "abc"; 
String str = "xyz";

假设第三个变量应具有不同的名称:


在编译时,相同的
“abc”
字符串将与
“xyz”
一起拉入字符串池。因此,您将得到两个字符串变量,它们指向同一个
“abc”
实例,一个指向
“xyz”

,将在字符串常量池(SCP)中创建一个包含内容的字符串对象

 "abc"
1.
str
reference将指向该对象

在创建第二个对象时,jvm将检查SCP中是否有相同的“abc”内容 在你的情况下,已经可以这样做了

2
str1
将指向现有对象

3.
String str=“xyz”
已经
str
指向了
abc
内容对象,我们再次分配给
xyz

Code will not compile as you are using duplicate `str` variable 

这样想,

  • 当第一个变量
    Str
    初始化为“abc”时,然后文本“abc”获取字符串池中的内存,因此变量
    Str
    获取对该“abc”的引用

    Str
    ------------------------------------>
    abc

  • 在第二步中,以类似的方式,另一个变量引用字符串池中的相同文本

    Str
    ------------------------------------>
    abc
    abc
    xyz

  • Code will not compile as you are using duplicate `str` variable 
    
  • 最后我们将得到它,并在字符串池中有2个文本,即
    abc
    xyz

    Str
    ----------------------------------->
    xyz
    Str1
    ----------------------------------->
    abc


  • 此代码没有编译?除非有人这样问,否则请更正引号类型
    ”“
    这是否真的是一个面试问题?在采访中,我从未被要求了解这些知识。这很好。我相信,关于OOP、设计模式、最佳实践等方面的知识比了解字符串池(尽管我也认为,优秀的Java程序员应该了解这些内部结构)更有价值。那家伙只问了弦的事。