Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串是不可变的!但我仍然可以修改并获得原始字符串的新副本?_Java_String - Fatal编程技术网

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中,它是引用对象的唯一选项。