String s1 = new String("anil");
String s2 = s1.toUpperCase();
String s3 = s1.toLowerCase();
System.out.println(s1 == s2);
System.out.println(s1 == s3);
如果在堆中創建字符串對象,那麼兩者都是false.But它會給出false,true。如果我們使用新字符串(「abcd」)在堆中創建字符串對象
String s1 = new String("anil");
String s2 = s1.toUpperCase();
String s3 = s1.toLowerCase();
System.out.println(s1 == s2);
System.out.println(s1 == s3);
如果在堆中創建字符串對象,那麼兩者都是false.But它會給出false,true。如果我們使用新字符串(「abcd」)在堆中創建字符串對象
String s1 = new String("anil");
此語句創建一個新的對象
而這一點,
String s3 = s1.toLowerCase();
點1對象的位置是s1
並且那您是第二次獲得true
的原因條件
另請參閱how java handles strings以獲得清晰的理解
希望這有助於!
+1 ..因爲如果沒有大寫字符,toLowerCase將返回相同的字符串。 – TheLostMind
@WhoAmI +1給評論,應該加到回答 –
有4個字符串這裏對象:
沒有兩個通過==運算符相等。
除了是toLowerCase()可能會返回相同的對象,如果它已經小寫。 Javadoc中沒有這方面的內容,因此在實現中的任何此類行爲都不能被依賴。
這裏S1對象將在堆中創建。它的值存儲在常量字符串池中。
S2是字符串文字不是對象。所以第一個JVM會檢查字符串是否在常量池中。如果String有常量池,它不會創建新的對象。它將返回可用對象的引用。
這裏s1.toUpper將返回「ANIL」。 「ANIL」不在常量池中。所以會創建新的對象。並將其與s1進行比較(使用'==')會導致錯誤。
與S3相同。但是對於S3,它不會創建新的對象,因爲「anil」已經存在於常量池中。 所以會返回S1的參考。所以它是真實的。
研究下面的鏈接
如果你看一下結果與toLowerCase在String類()方法。
toLowerCase(Locale locale)
toLowerCase(Locale locale)
inturn使用Character.toLowerCase(c)
Character.toLowerCase(c)
在字符類有此評論 -
這段代碼可能對你有幫助嗎?它是什麼? – EJP
@EJP - 我的不好。我編輯了我的答案。上面的代碼讓我認爲如果char已經是小寫字符,String的toLowercase()將不會執行任何操作。 – TheLostMind
案例1:字符串Capital First Letter
。
> String s1 = new String("Ajay")
String s2 = s1.toUpperCase()
String s3 = s1.toLowerCase()
System.out.println s1 == s2
System.out.println s1 == s3
false
false
案例2:字符串Small First Letter
。
> String s1 = new String("ajay")
String s2 = s1.toUpperCase()
String s3 = s1.toLowerCase()
System.out.println s1 == s2
System.out.println s1 == s3
false
true
在案例1,由於串具有大寫字母,轉換爲小寫將產生新對象,因此新的參考爲它而在案例2小的第一信轉換爲小寫後仍然會指向相同的對象,因爲原始對象相同,因此爲同一對象創建兩個引用。
你可以很清楚地看到Groovy Shell
的輸出。
s3將指向與s1相同的字符串。所以這是真的。檢查toLowerCase()的實現; – TheLostMind
@WhoAmi沒有* toLowerCase()指定*這樣的行爲,所以它不能被依賴。 – EJP
@EJP - 請檢查我的更新答案。 – TheLostMind