2011-12-14 58 views

回答

6

字符串是不可改變的

是的,你自己也承認。一個不可變的對象是一個不允許改變其狀態的對象。這包括String對象。

然後:

str.toLowerCase(); 

創建新的字符串的小寫字母不使用結果。在這種情況下,這可能是一個「bug」,因爲str仍然評估爲原始字符串對象(這是而不是因爲它是不可變的而發生更改)。

沒有編譯器錯誤,因爲Java無法知道返回值是「應該使用」的。有時候會爲副作用調用方法,即使它也返回值*。這可能被認爲是一些純語言(無副作用的語言)的錯誤,但在一般語言中不可能有副作用。一些靜態分析工具 - 不是javac,它只是一個帶有一組原始警告的編譯器 - 能夠通過應用其他啓發式規則來檢測上述錯誤。

同上,但新的字符串分配給相同的變量:(變量是值/對象。)

str = str.toLowerCase(); 

然而,不要求,同樣的變量被重新分配給。考慮下面的例子,這可能在上下文中是完全有效的:

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

快樂編碼。


*引起的副作用和返回通常被忽略的值是List.remove(int)相對常見的方法的一個例子。

6

只有第一個纔有效; String.toLowerCase()返回是一個新的字符串,它不會改變任何地方。

1

第一個是你是如何做到的。

0

,因爲它替換到新的全部小寫實例的引用的參考老String實例您應該使用的第一個版本

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

。第二個版本

str.toLowerCase(); // the wrong way 

不通過str改變提到的String實例(這是什麼不變性手段),而是返回一個新的全小寫的實例,然後將其忽略。

1

您需要分配:

str = str.toLowerCase(); 

這些方法返回一個字符串 - 他們不修改字符串。

0

第一個。重新分配它。

str= str.toLowerCase(); 
0

str.toLowerCase();它自己不會做任何事情。該方法返回一個值,因此您應該在賦值或條件中使用該值。

1

Java字符串是不變的,所以

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; 
} 

這被認爲是一種糟糕的編程習慣。切勿爲方法參數分配新的值(調用堆棧上有足夠的內存;-)。

相關問題