字符串不变性.更改后我是否必须将其重新分配给同一个变量?

Mr1*_*9pm -1 java

字符串是不可变的,这是否意味着我总是要通过传递给方法的字符串来做类似的事情?

str= str.toLowerCase();
Run Code Online (Sandbox Code Playgroud)

或是

str.toLowerCase();
Run Code Online (Sandbox Code Playgroud)

精细?我尝试了第二个,它没有给我任何错误,为什么?

ant*_*oft 6

只有第一个会起作用; 在String.toLowerCase()返回的是一个新的字符串,它不到位任何改变.


小智 6

字符串是不可变的

是的,由你自己承认.不可变对象是不允许更改其状态的对象.这包括String对象.

然后:

str.toLowerCase();
Run Code Online (Sandbox Code Playgroud)

创建一个的小写字符串,不使用结果.在这种情况下,这可能是一个"错误",因为str仍然评估原始字符串对象(由于它是不可变的,因此没有更改).

没有编译器错误,因为Java无法知道返回值是"应该使用".有时会调用方法来产生副作用,即使它也返回值*.这可以被判断为某些纯语言(没有副作用的语言)中的错误,但是在具有副作用的语言中通常是不可能的.一些静态分析工具 - 不是javac,它只是一个带有一组原始警告的编译器 - 能够通过应用额外的启发式规则来检测上述错误.

同上,但分配新的字符串相同的变量:(变量是.值/对象)

str = str.toLowerCase();
Run Code Online (Sandbox Code Playgroud)

但是,不要求重新分配相同的变量.请考虑以下示例,这些示例在上下文中可能完全有效:

String normalizedTitle = title.toLowerCase();
foo.setTitle(normalizedTitle);
// or, skip normalizedTitle, etc.
foo.setTitle(title.toLowerCase());
Run Code Online (Sandbox Code Playgroud)

快乐的编码.


*导致副作用返回通常被忽略的值的相对常见方法的示例是List.remove(int).