Java 字符串的工作原理

2022-09-05 00:11:02

我试图确切地理解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!

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


答案 1

让图像为您解释一下:

String example

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

  1. String name = "Jacob Perkins;"字符串“Jacob Perkins”被创建,并指向它。name
  2. name = name + "!";一个新的字符串“Jakob Perkins!”被创建,引用现在指向新的字符串。但是,旧的保持不变,因为 String 是不可变的。

答案 2

字符串本身一旦创建,就永远无法更改。代码示例所做的是将 name 中的字符串替换为以前的 name 内容构造的新字符串和感叹号。(name的原始内容不再被任何变量引用,最终将由垃圾回收器收获。

如果要检查已编译的代码(或使用调试器单步执行),您会发现表达式已编译到 StringBuilder 对象的创建和对该对象执行一些操作。name + "!"

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