我试图确切地理解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!
如果字符串应该是不可变的,为什么会发生这种情况?为什么我能给字符串重新赋值?
String对象是不可变的,只有变量引用发生了变化。
在您的示例中,“Jacob Perkins”对象仍然存在,新对象“Jacob Perkins!”被创造出来。
name变量指向新对象。
字符串本身一旦创建,就永远无法更改。您的代码示例所做的是将name中的字符串替换为一个新字符串,该字符串是根据name之前的内容构造的,并带有一个感叹号。(name的原始内容不再被任何变量引用,最终将被垃圾收集器获取。)
如果要检查编译后的代码(或使用调试器逐步执行),您会发现您的名称“!”
表达式被编译成一个StringBuilder对象的创建和对该对象的一些操作。
也就是说,字符串是不可变的,但变量名不是。它的值会改变,指向不同的字符串。字符串本身永远不会改变。
让一个图像来为你解释这一点:
在左侧,您有变量,它实际上是一个引用。
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”。一个直接存在于堆中,另一个存在于字符串池中?