2014-04-21 45 views
3
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」)在堆中創建字符串對象

+0

s3將指向與s1相同的字符串。所以這是真的。檢查toLowerCase()的實現; – TheLostMind

+0

@WhoAmi沒有* toLowerCase()指定*這樣的行爲,所以它不能被依賴。 – EJP

+0

@EJP - 請檢查我的更新答案。 – TheLostMind

回答

3
String s1 = new String("anil"); 

此語句創建一個新的對象

而這一點,

String s3 = s1.toLowerCase(); 

點1對象的位置是s1

並且那您是第二次獲得true的原因條件

另請參閱how java handles strings以獲得清晰的理解

希望這有助於!

+7

+1 ..因爲如果沒有大寫字符,toLowerCase將返回相同的字符串。 – TheLostMind

+0

@WhoAmI +1給評論,應該加到回答 –

1

4個字符串這裏對象:

  • 文字,由編譯器和類加載器
  • S1,通過新的String()創建
  • S2,通過toUpperCase創建創建()
  • s3,由toLowerCase()創建。

沒有兩個通過==運算符相等。

除了是toLowerCase()可能會返回相同的對象,如果它已經小寫。 Javadoc中沒有這方面的內容,因此在實現中的任何此類行爲都不能被依賴。

0

這裏S1對象將在堆中創建。它的值存儲在常量字符串池中。

S2是字符串文字不是對象。所以第一個JVM會檢查字符串是否在常量池中。如果String有常量池,它不會創建新的對象。它將返回可用對象的引用。

這裏s1.toUpper將返回「ANIL」。 「ANIL」不在常量池中。所以會創建新的對象。並將其與s1進行比較(使用'==')會導致錯誤。

與S3相同。但是對於S3,它不會創建新的對象,因爲「anil」已經存在於常量池中。 所以會返回S1的參考。所以它是真實的。

研究下面的鏈接

Study this

0

如果你看一下結果與toLowerCase在String類()方法。

  1. 它調用toLowerCase(Locale locale)
  2. toLowerCase(Locale locale) inturn使用Character.toLowerCase(c)
  3. Character.toLowerCase(c)在字符類有此評論 -

    • @param CH角色轉換。
    • @返回字符的小寫等價物,如果有的話;
    • 否則,人物本身。
+0

這段代碼可能對你有幫助嗎?它是什麼? – EJP

+0

@EJP - 我的不好。我編輯了我的答案。上面的代碼讓我認爲如果char已經是小寫字符,String的toLowercase()將不會執行任何操作。 – TheLostMind

0

案例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的輸出。

相關問題