当前位置: 首页 > 知识库问答 >
问题:

字符串实习如何在Java7中工作?[复制]

阮华美
2023-03-14

所以,我意识到我要问的问题与一个一次又一次被打死的话题有关,然而,即使在阅读了我能找到的所有答案和留档后,我仍然对字符串实习有点困惑。也许是因为我对JVM缺乏了解;也许是因为Java7中引入的变化贬低了前面提到的许多答案和留档。不管怎样,我都被卡住了,我希望有人能帮我更清楚地理解这个概念...

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

在上面的示例中,我知道将创建两个字符串对象。我还了解到,内存中只有一个包含序列“t”、“e”、“x”和“t”的char数组。

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

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

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

再一次,很抱歉问了这么多令人困惑/愚蠢的问题,只是我对JVM的结构和内部工作相对陌生,很多问题让我头晕目眩。谢谢

共有2个答案

呼延烈
2023-03-14

当你说新字符串()时,你会得到一个新的对象,所以请考虑

String a = "text";
String b = new String("text");
System.out.println(a == b);
b = b.intern();
System.out.println(a == b);

然后,首先,a==b将显示false,因为它们是不同的引用。如果我们说b=b.intern()b,那么我们可以再次测试并得到true。我希望这有帮助。自1.0版以来,上述代码在Java中的工作方式与之相同(现在在Java 8中仍然是这样)。

林俊英
2023-03-14

java中有一种称为字符串内存池的东西,当您声明:

String str1="abc";

它进入内存池,而不是堆。但当你写作时:

String str2=new String("abc");

如果您再次写入以下内容,它会在堆上创建一个完整的对象:

String str3 = "abc"; 

它不会在池上再创建任何对象,它将检查池,如果该文本已经存在,它将为其分配该文本。但写作:

String str4 = new String("abc");

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

关键是:

只要您继续写入以下内容,就会始终在堆上创建一个新对象:

new String("abc");

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

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

 类似资料:
  • 问题内容: 因此,我意识到我要问的问题与一个又一次被折磨致死的话题有关,但是,即使阅读了所有我能找到的答案和文档,我仍然对此感到困惑字符串实习。也许是由于我对JVM缺乏了解;可能是由于Java 7中引入的更改使上述许多答案和文档贬值了。无论哪种方式,我都被困住了,希望有人可以帮助我更清楚地理解这个概念… 在上面的示例中,我知道将创建两个String对象。我也明白,内存中将只有一个包含序列的char

  • 我试图确切地理解Java字符串是如何不可变的。我明白这应该是一个简单的概念,但在阅读了几个在线网页后,我仍然不太明白。 我不明白Java字符串是如何“不可变”的。我目前有以下代码: 我的输出如下: 如果字符串应该是不可变的,为什么会发生这种情况?为什么我能给字符串重新赋值?

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

  • 问题内容: 我在bash中有以下字符串 我想从创建一个。该包含重复直到长度= 20这样的结果应该是这样的: 在bash中如何做? 问题答案: 这应该工作:

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

  • 我想对字符串执行子字符串操作。我有字符串<代码> 我尝试了finame=mainname。子字符串(0,mainname.lastIndexOf(“.”) 但我得到了<代码>