String是不可变的,原因有以下几点:
- 安全性:参数通常
String
以网络连接,数据库连接URL,用户名/密码等形式表示。如果可变,则可以轻松更改这些参数。
同步和并发性:使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


