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

时间:2011-12-14 22:53:56

标签: java

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

str= str.toLowerCase();

或是

str.toLowerCase();

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

8 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:6)

  

字符串是不可变的

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

然后:

str.toLowerCase();

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

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

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

str = str.toLowerCase();

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

String normalizedTitle = title.toLowerCase();
foo.setTitle(normalizedTitle);
// or, skip normalizedTitle, etc.
foo.setTitle(title.toLowerCase());

快乐的编码。


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

答案 2 :(得分:1)

第一个是你如何做到的。

答案 3 :(得分:1)

您需要指定:

str = str.toLowerCase();

这些方法返回 new 字符串 - 它们不会修改字符串。

答案 4 :(得分:1)

Java String是不可变的,所以

str.toLowerCase();

不会更改str中的任何内容,只会返回一个新字符串,其中所有字符str都会转换为小写。因此,如果您想使用str的小写字符串,则必须编码

String lower = str.toLowerCase(); 
System.out.println(str + " to lower case: " + lower);

如果str是方法参数而不是局部变量或字段,则即使它有效,也不应使用以下赋值:

public String toLowerCase(String str) {
  str = str.toLowerCase();
  return str;
}

这被认为是一种糟糕的编程习惯。切勿为方法参数指定新值(调用堆栈上有足够的内存; - )。

答案 5 :(得分:0)

您应该使用第一个版本

str = str.toLowerCase(); // the right way

因为它使用对新的全小写实例的引用替换对旧String实例的引用。第二个版本

str.toLowerCase(); // the wrong way

不会更改String引用的str实例(这是 immutability 的含义),但会返回一个全新的小写实例,然后将其忽略。

答案 6 :(得分:0)

第一个。重新分配。

str= str.toLowerCase();

答案 7 :(得分:0)

str.toLowerCase();它本身不会做任何事情。该方法返回一个值,因此您应该在赋值或条件中使用该值。