字符串是不可变的吗?
String s = "PROJECT";
此处s
无法修改。但是String s2=s.toLowerCase()
会给我一个新的字符串。在这里,我仍然可以获得原始字符串的新副本!但是如果Java仍然需要不变性,那么为什么不在修改字符串时限制用户(抛出异常或其他东西)。那为什么不变吗?任何人都可以解释原因吗?
答案 0 :(得分:6)
有一点误解:
s
不是一成不变的。可以轻松地为s
分配一个新值(即另一个 String
对象的另一个refence),除非它是final
。
并且只是因为String
实例是不可变的并不意味着您无法使另一个 String
从第一个String
中获取其值实例但略有不同。
实际上,只有 方式可以“修改”Java中的字符串:您无法更改任何给定String
对象的内容,但可以< / em>创建一个已修改内容的副本(该副本再次不可变!)。
答案 1 :(得分:3)
字符串是不可变的,这意味着这总是正确的:
String s = "PROJECT";
String s2 = s.toLowerCase();
System.out.println(s.equals("PROJECT")); // Prints true
System.out.println(s.equals(s2)); // Prints false
相比之下,请考虑如果字符串是可变的会发生什么。
MutableString ms = "PROJECT";
MutableString ms2 = ms.toLowerCase();
System.out.println(ms.equals("PROJECT")); // Prints false
System.out.println(ms.equals(ms2)); // Prints true
此示例可能看似微不足道,但这意味着除非您实际重新分配引用s
,否则您可以保证s
不会被任何代码更改。