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

新手上路,请多包涵

我在采访中被问到为什么 String 是不可变的

我这样回答:

当我们像 String s1="hello"; 这样在 java 中创建一个字符串时,将在 字符串池(hello) 中创建一个对象, s1 将指向 hello 。现在如果我们再次这样做 String s2="hello"; 然后另一个对象不会创建,但 s2 将指向 hello 因为 JVM 将首先检查 字符串池中 是否存在相同的对象。如果不存在,则只创建一个新对象,否则不创建。

现在,如果假设 java 允许字符串可变,那么如果我们将 s1 更改为 hello world 那么 s2 值也将是 hello world 所以 java String 是不可变的。

任何人都可以告诉我我的回答是 还是

原文由 rocking 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 330
1 个回答

String 是不可变的有几个原因,这里是一个总结:

  • 安全 性:参数通常在网络连接、数据库连接 URL、用户名/密码等中表示为 String 。如果它是可变的,则可以轻松更改这些参数。
  • 同步 和并发:自动使 String 不可变使它们成为线程安全的,从而解决了同步问题。
  • 缓存:当编译器优化您的 String 对象时,它会发现如果两个对象具有相同的值(a=“test” 和 b=“test”),因此您只需要一个字符串对象(对于 a 和 b,这两个将指向同一个对象)。
  • 类加载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

原文由 user508434 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题