我有基本的困惑。
String s2=new String("immutable");
System.out.println(s2.replace("able","ability"));
s2.replace("able", "abled");
System.out.println(s2);
在第一个打印语句中,它打印的是不可变性,但它是不可变的,对吗?为什么这样?并且在下一个打印声明中它不会被替换>欢迎任何答案..
System.out.println(s2.replace("able","ability"));
在上面的行中,返回并打印了一个新字符串。
返回一个新字符串,该字符串是用 newChar 替换此字符串中所有出现的 oldChar 所产生的。
s2.replace("able", "abled");
它执行replace
操作但没有将结果分配回来。因此原始字符串保持不变。
如果分配结果,您会看到结果。
喜欢
String replacedString = s2.replace("able", "abled");
System.out.println(replacedString );
或者
s2= s2.replace("able", "abled");
System.out.println(s2);
更新:
当你写线
System.out.println(s2.replace("able","ability"));
解析并返回 String 传递给该s2.replace("able","ability")
函数。
该replace(String,String)
方法返回一个新字符串。第二次调用replace()
返回替换,但您没有将其分配给任何东西,然后当您s2
再次打印出不可变时,您会看到未更改的值。
String#replace
返回结果String
而不修改原始(不可变)String
值...
例如,如果将结果分配给另一个String
,您将得到相同的结果
String s2=new String("immutable");
String s3 = s2.replace("able","ability");
System.out.println(s3);
s2.replace("able", "abled");
System.out.println(s2);
会给你同样的输出...
让我们看看第 2 行:
System.out.println(s2.replace("able","ability"));
这将打印不变性,这是因为
s2.replace("able","ability")
将返回另一个字符串,其输入如下:
System.out.println(tempStr);
但在第三个声明中,
s2.replace("able", "abled");
没有分配给另一个变量,所以返回一个字符串但没有分配给任何变量。因此丢失,但 s2 保持原样。
Immutable objects are simply objects whose state (the object's data) cannot change after construction
您的代码s2.replace("able","ability")
,它返回一个新的字符串,并没有发生任何事情s2
。
而且因为replace
函数返回一个新的字符串,所以你可以打印结果System.out.println(s2.replace("able","ability"));
String 是不可变的,但 String 有很多方法可以用作Rvalue
另见:
String s2=new String("immutable");
1)当我们像上面那样创建一个字符串时,会创建一个新对象。如果我们尝试修改它,则会使用我们提供的内容创建一个新对象,并且我们的字符串 s2 不会被修改。
2)如果我们需要s2对象中的修改值,那么将上面的代码替换为..
String s2=new String("immutable");//Creates a new object with content 'immutable'
System.out.println(s2.replace("able","ability"));//creates a new object with new content as //immutability
s2=s2.replace("able", "abled");//Here also it creates a new object,Since we are assigning it //to s2,s2 will be pointing to newly created object.
System.out.println(s2);//prints the s2 String value.