Java 字符串是不可变的!但我仍然可以修改并获得原始字符串的新副本?
可能重复:Java 字符串是不可变的!但我仍然可以修改并获得原始字符串的新副本?,java,string,Java,String,可能重复: 字符串是不可变的 String s = "PROJECT"; 此处s无法修改。但是String s2=s.toLowerCase()将返回一个新字符串。在这里我仍然可以得到原始字符串的新副本!但是如果Java仍然希望不可变,那么为什么不在修改字符串时限制用户(抛出异常或其他东西)。那么为什么是不变性呢?有人能解释一下原因吗?有一点误解: s不是一成不变的s可以很容易地分配一个新值(即另一个引用到另一个字符串对象),除非它是最终的 仅仅因为一个String实例是不可变的,并不意味着
字符串是不可变的
String s = "PROJECT";
此处
s
无法修改。但是String s2=s.toLowerCase()
将返回一个新字符串。在这里我仍然可以得到原始字符串的新副本!但是如果Java仍然希望不可变,那么为什么不在修改字符串时限制用户(抛出异常或其他东西)。那么为什么是不变性呢?有人能解释一下原因吗?有一点误解:
s
不是一成不变的<代码>s可以很容易地分配一个新值(即另一个引用到另一个字符串
对象),除非它是最终的
仅仅因为一个String
实例是不可变的,并不意味着你不能创建另一个String
实例,它从第一个String
实例派生出它的值,但它略有不同
事实上,这是在Java中“修改”字符串的唯一方法:您不能更改任何给定
字符串对象的内容,但您可以创建一个已修改内容的副本(该副本随后又是不可变的!)。有一点误解:
s
不是一成不变的<代码>s
可以很容易地分配一个新值(即另一个引用到另一个字符串
对象),除非它是最终的
仅仅因为一个String
实例是不可变的,并不意味着你不能创建另一个String
实例,它从第一个String
实例派生出它的值,但它略有不同
事实上,这是在Java中“修改”字符串的唯一方法:您不能更改任何给定字符串对象的内容,但您可以创建一个已修改内容的副本(该副本同样是不可变的!)。字符串是不可变的,这意味着这始终是正确的:
String s = "PROJECT";
String s2 = s.toLowerCase();
System.out.println(s.equals("PROJECT")); // Prints true
System.out.println(s.equals(s2)); // Prints false
比较一下,考虑如果字符串是可变的会发生什么。< /P>
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
不会被任何一段代码更改。字符串是不可变的,这意味着这始终是正确的:
String s = "PROJECT";
String s2 = s.toLowerCase();
System.out.println(s.equals("PROJECT")); // Prints true
System.out.println(s.equals(s2)); // Prints false
比较一下,考虑如果字符串是可变的会发生什么。< /P>
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
不会被任何代码更改。不变性有许多优点。看看这个,哇!别把感叹号放在那里!您可能会伤害自己。“这里的s不能修改。但是字符串s2=s.toLowerCase()将返回一个新字符串。”这就是不变性的要点。如果它是可变的,它可以返回相同的字符串,值已更改。重要的是不要混淆s
,这是对字符串的引用,在本例中该字符串不是不可变的,而引用的字符串是不可变的。在其他语言中,引用可能有一个特殊的符号,如&
,但是在Java中,它是引用对象的唯一选项。不可变性有许多优点。看看这个,哇!别把感叹号放在那里!您可能会伤害自己。“这里的s不能修改。但是字符串s2=s.toLowerCase()将返回一个新字符串。”这就是不变性的要点。如果它是可变的,它可以返回相同的字符串,值已更改。重要的是不要混淆s
,这是对字符串的引用,在本例中该字符串不是不可变的,而引用的字符串是不可变的。在其他语言中,引用可能有一个特殊的符号,如&
,但是在Java中,它是引用对象的唯一选项。