字符串是不可改变的!但我仍然可以修改并获得原始字符串的新副本?

时间:2011-09-21 06:45:30

标签: java string

  

可能重复:
  What's the advantage of a String be Immutable?

字符串是不可变的吗?

String s = "PROJECT";

此处s无法修改。但是String s2=s.toLowerCase()会给我一个新的字符串。在这里,我仍然可以获得原始字符串的新副本!但是如果Java仍然需要不变性,那么为什么不在修改字符串时限制用户(抛出异常或其他东西)。那为什么不变吗?任何人都可以解释原因吗?

2 个答案:

答案 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不会被任何代码更改。