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

标签 java string

在一次采访中有人问我为什么 String 是不可变的

我是这样回答的:

When we create a string in Java like String s1="hello"; then an object will be created in string pool(hello) and s1 will be pointing to hello. Now if again we do String s2="hello"; then another object will not be created, but s2 will point to hello because JVM will first check if the same object is present in string pool or not. If not present, then only a new one is created, else not.

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

我的答案是对还是错?

最佳答案

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

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

话虽这么说,String 的不变性仅意味着您无法使用其公共(public) API 更改它。事实上,您可以使用反射绕过普通 API。查看答案here

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

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

关于java - 为什么Java中的String是不可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58304007/

相关文章:

java - JSOUP - 从先前抓取的页面上找到的 URL 抓取图像和文本

java - VisualVM 打破 jetty

java - "lazy loading"是orm还是jpa的特征?

java - 如何将sql azure数据检索到 ListView 中?

php - 从 Mysql 获取逗号分隔的字符串

python - 从字符串中提取日期 ("05/Jan/2014")

java - 如何整理一个TreeMap<String, Integer>?

r - R 中 character() 和 ""之间的差异

python - 字符串和文件

string - Matlab - 为匿名函数动态生成字符串