一尘不染

为什么在Java中String是不可变的?

java

有人问我为什么String是不可变的

我这样回答:

当我们在Java中像这样创建一个字符串时,String s1="hello";将在字符串pool(hello)中创建一个对象,并且s1将指向hello。现在再次执行该操作String s2="hello";将不会创建另一个对象,但是s2将指向该对象,hello 因为JVM将首先检查如果在字符串池中是否存在相同的对象, 如果不存在则仅创建一个新对象。

现在,如果假设Java允许串可变那么如果我们改变S1到hello world那么S2价值也将hello world因此Java字符串是不可改变的。

有谁能告诉我我的答案是对还是错?


阅读 327

收藏
2020-03-12

共1个答案

一尘不染

String 是不可变的,原因有以下几点:

  • 安全性:参数通常String以网络连接,数据库连接URL,用户名/密码等形式表示。如果可变,则可以轻松更改这些参数。
    同步和并发性:使String不可变自动使其线程安全,从而解决了同步问题。
  • 缓存:当编译器优化你的String对象时,它会看到如果两个对象具有相同的值(a =“ test”b =“ test”),因此你只需要一个字符串对象(对于ab,这两个对象将指向同一对象)。
  • 类加载:String用作类加载的参数。如果可变,则可能导致装入错误的类(因为可变对象更改其状态)。
    话虽这么说,不变性String仅表示你无法使用其公共API对其进行更改。实际上,你可以使用反射来绕过常规API。在这里查看答案。

在你的示例中,如果String是可变的,请考虑以下示例:

  String a="stack";
  System.out.println(a);//prints stack
  a.setValue("overflow");
  System.out.println(a);//if mutable it would print overflow
2020-03-12