字符串是不可變的,這是否意味着我總是不得不用類似的方法來傳遞給方法的字符串?字符串不變性。改變它之後,我必須重新將它分配給同一個變量嗎?
str= str.toLowerCase();
或者是
str.toLowerCase();
罰款?我試過第二個,它不會給我任何錯誤,爲什麼?
字符串是不可變的,這是否意味着我總是不得不用類似的方法來傳遞給方法的字符串?字符串不變性。改變它之後,我必須重新將它分配給同一個變量嗎?
str= str.toLowerCase();
或者是
str.toLowerCase();
罰款?我試過第二個,它不會給我任何錯誤,爲什麼?
字符串是不可改變的
是的,你自己也承認。一個不可變的對象是一個不允許改變其狀態的對象。這包括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)
相對常見的方法的一個例子。
只有第一個纔有效; String.toLowerCase()
返回是一個新的字符串,它不會改變任何地方。
第一個是你是如何做到的。
,因爲它替換到新的全部小寫實例的引用的參考老String
實例您應該使用的第一個版本
str = str.toLowerCase(); // the right way
。第二個版本
str.toLowerCase(); // the wrong way
不通過str
改變提到的String
實例(這是什麼不變性手段),而是返回一個新的全小寫的實例,然後將其忽略。
您需要分配:
str = str.toLowerCase();
這些方法返回一個新字符串 - 他們不修改字符串。
第一個。重新分配它。
str= str.toLowerCase();
str.toLowerCase();
它自己不會做任何事情。該方法返回一個值,因此您應該在賦值或條件中使用該值。
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;
}
這被認爲是一種糟糕的編程習慣。切勿爲方法參數分配新的值(調用堆棧上有足夠的內存;-)。
你爲什麼不只是嘗試它呢? – 2011-12-14 22:58:04