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

Java字符串如何工作[重复]

王凯旋
2023-03-14

我试图确切地理解Java字符串是如何不可变的。我明白这应该是一个简单的概念,但在阅读了几个在线网页后,我仍然不太明白。

我不明白Java字符串是如何“不可变”的。我目前有以下代码:

public static void main(String[] args) {

  String name = "Jacob Perkins";

  System.out.println( name );

  name = name + "!";

  System.out.println( name );

}

我的输出如下:

Jacob Perkins
Jacob Perkins!

如果字符串应该是不可变的,为什么会发生这种情况?为什么我能给字符串重新赋值?

共有3个答案

蔺沛
2023-03-14

String对象是不可变的,只有变量引用发生了变化。

在您的示例中,“Jacob Perkins”对象仍然存在,新对象“Jacob Perkins!”被创造出来。

name变量指向新对象。

柯波峻
2023-03-14

字符串本身一旦创建,就永远无法更改。您的代码示例所做的是将name中的字符串替换为一个新字符串,该字符串是根据name之前的内容构造的,并带有一个感叹号。(name的原始内容不再被任何变量引用,最终将被垃圾收集器获取。)

如果要检查编译后的代码(或使用调试器逐步执行),您会发现您的名称“!” 表达式被编译成一个StringBuilder对象的创建和对该对象的一些操作。

也就是说,字符串是不可变的,但变量名不是。它的值会改变,指向不同的字符串。字符串本身永远不会改变。

华睿识
2023-03-14

让一个图像来为你解释这一点:

在左侧,您有变量,它实际上是一个引用。

  1. String name=“Jacob Perkins;” 字符串“Jacob Perkins”被创建,并且name指向它

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

  • 我有一根这样的绳子。 如何在Java中将字符串解析成多行?

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

  • 我已经做了这个程序,我被卡住了。当我运行它时,我的输入没有使用空格,它工作得很好,例如,在customer input中只输入。但是,当我输入时,它会合并接下来的两个字符串输入方向(如所附的pic所示)。我在这里做错了什么?

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

  • 问题内容: 众所周知,如果不存在,则在字符串池中添加String值的方法。如果存在,它将返回该值/对象的引用。 我需要知道,当我调用此实习生方法时会做什么? 在字符串池中添加具有不同引用的“ dog”或在字符串池中添加对象引用(我认为不是这种情况)? 我试过了 我只想确保当我调用它时在字符串池中创建具有相同值的新对象?现在我有2个对象的值为“ dog”。一个直接存在于堆中,另一个存在于字符串池中?