当前位置: 首页 > 面试题库 >

字符串实习在Java 7+中如何工作?

周高畅
2023-03-14
问题内容

因此,我意识到我要问的问题与一个又一次被折磨致死的话题有关,但是,即使阅读了所有我能找到的答案和文档,我仍然对此感到困惑字符串实习。也许是由于我对JVM缺乏了解;可能是由于Java
7中引入的更改使上述许多答案和文档贬值了。无论哪种方式,我都被困住了,希望有人可以帮助我更清楚地理解这个概念…

String a = "text";
String b = new String("text");

在上面的示例中,我知道将创建两个String对象。我也明白,内存中将只有一个包含序列的char数组't', 'e', 'x', and 't'

但是,每个字符串对象实际上存储在内存中的什么位置?

如果我已阅读正确的话:变量的引用a将存储在常量池中,而的引用b将存储在堆中,对吗?

如果真是这样,我对内部池如何维护内部字符串感到困惑。它是否跟踪在常量池中定义的字符串以及.intern()从堆中手动插入(调用)的字符串?JVM是否创建在常量池中定义的字符串对象并将其加载到内部池?我对这一切的运作方式感到困惑…

再一次,很抱歉问到这些令人困惑的问题,仅仅是我对它的结构和内部工作还比较陌生,而其中的许多东西使我无所适从JVM。谢谢!


问题答案:

声明时,java中有一个叫做String Memory Pool的东西:

String str1="abc";

它去那个内存池而不是堆。但是当你写:

String str2=new String("abc");

如果再次输入,它将在堆上创建完整的对象。

String str3 = "abc";

它不会在池上创建更多对象,它将检查池中是否存在此文字,并将其分配给该对象。但是写:

String str4 = new String("abc");

将再次在堆上创建一个新对象

关键是:

一个新对象将始终在您不断编写的时候在堆上创建多次:

new String("abc");

但是,如果您不使用关键字new继续直接分配字符串,则只会从内存池中引用它(如果内存池中不存在它,则会创建它)

intern()方法查找字符串是否在内存池中(如果不是)将其添加到内存池并返回对其的引用。因此,使用此方法后,您的String引用不会指向堆上的任何对象,而是指向String内存池中的一个对象(还要注意,该内存池仅包含唯一的字符串)。



 类似资料:
  • 所以,我意识到我要问的问题与一个一次又一次被打死的话题有关,然而,即使在阅读了我能找到的所有答案和留档后,我仍然对字符串实习有点困惑。也许是因为我对JVM缺乏了解;也许是因为Java7中引入的变化贬低了前面提到的许多答案和留档。不管怎样,我都被卡住了,我希望有人能帮我更清楚地理解这个概念... 在上面的示例中,我知道将创建两个字符串对象。我还了解到,内存中只有一个包含序列“t”、“e”、“x”和“

  • 我一直在用Swift 3更新我的一些旧代码和答案,但当我使用Swift字符串和子字符串进行索引时,事情变得很混乱。 具体来说,我尝试了以下方法: 第二行给出了以下错误 “String”类型的值没有成员“substringWithRange” 我看到,String现在确实有以下方法: 起初我真的很困惑,所以我开始围绕索引和范围玩。这是子串的后续问答。我在下面添加一个答案来展示它们是如何使用的。

  • 问题内容: 管这个问题在实际中没有任何实际用途,但我对Python如何进行字符串实习感到好奇。我注意到以下内容。 这是我所期望的。 您也可以这样做。 那真是太聪明了! 但是你不能这样做。 Python为什么不评估,并意识到它s1与指向相同的地址相同?最后一个块到底在做什么False呢? 问题答案: 这是特定于实现的,但是你的解释器可能是内部编译时常量,而不是运行时表达式的结果。 接下来,我使用CP

  • 问题内容: 通常,我在互联网上的许多文章中都读到,当我们编写上面的语句时,会创建两个对象。在堆上创建一个String对象,在Literal Pool上创建一个字符串对象。并且堆对象还引用在Literal Pool上创建的对象。(如果我的陈述是错误的,请更正。) 请注意,以上解释是根据我阅读互联网上一些文章后的理解得出的。 所以我的问题是..有什么方法可以停止在文字池中创建字符串对象。怎么做? [请

  • 问题内容: 这是我在Java 1.6.0_27上获得的输出: 有人可以解释一下输出结果吗?我知道Java区分存储在堆中的String和存储在字符串“公共池”(可以被嵌入)中的String。在内部,它们的表示形式有何不同。它如何更改子字符串算法。请在适当的地方引用书籍/文章/博客等。 问题答案: 查看评论: 笔记: 从Java 7u6开始,子字符串返回一个新字符串,而不是原始字符串的视图(但这在该示