【问题标题】:Interview: what happens in memory when i initialize String str=”abc”; String str1=”abc”; String str=”xyz”采访:当我初始化String str=”abc”时,内存中发生了什么;字符串 str1=”abc”;字符串 str=”xyz”
【发布时间】:2014-05-08 06:22:10
【问题描述】:

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

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

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

【问题讨论】:

  • 这段代码不能编译?
  • 除非是这样问的,否则请更正引号的类型""
  • 这真的是面试题吗?我从来没有在面试中被问到这样的知识。这很好。我相信,有关 OOP、设计模式、最佳实践等方面的知识比了解字符串池更有价值(尽管我也认为,优秀的 Java 程序员应该了解这些内部知识)。
  • @Seelenvirtuose 是的,即使我很震惊。这家伙只问字符串。

标签: java string memory


【解决方案1】:

这样想,

  1. 当第一个变量 Str"abc" 初始化时,Literal "abc"String Pool 所以变量Str 引用了这个"abc"

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

  2. 在第二步中,以类似的方式,另一个变量引用 String Pool 中的相同文字。

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

  3. 在最后一步中,如果考虑String Str,那么Error 将像这样出现:-

    variable Str is already defined

    因此,我将采用Str = "xyz" 来执行此操作,New 文字将在 字符串池 中获取内存,并且 Str 之前的引用将被删除并分配新的引用。

    Str ------------X-------------> abc Str1

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

  4. 最后我们会得到这个,并且在 String Pool

    中有 2 个 Literalsabcxyz

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

【讨论】:

    【解决方案2】:

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

    在编译时,相同的"abc" 字符串将与"xyz" 一起被拉入字符串池。所以你最终会得到两个字符串变量指向"abc" 的同一个实例,一个指向"xyz"

    【讨论】:

      【解决方案3】:

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

       "abc"
      

      1.str 引用将指向该对象。

      在创建第二个对象时,jvm 将检查 SCP 中是否存在相同的“abc”内容 在您的情况下已经可用,所以

      2 str1 将指向现有对象

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 2019-12-19
        相关资源
        最近更新 更多