2017-09-25 131 views
1

如果我們使用String類的toUpperCase()方法,它是否將對象放在堆中而不是在字符串池中創建它。下面是代碼,當我運行時,我可以推斷新創建的字符串對象不在字符串池中。string.toUppercase()在堆或字符串池中創建一個新對象

public class Question { 
    public static void main(String[] args) { 
     String s1="abc"; 
     System.out.println(s1.toUpperCase()==s1.toUpperCase()); 
    } 
} 

輸出上述代碼返回的。 我知道「==」和equals()的區別,但在這個問題中,我想知道爲什麼兩個創建的字符串不相等。唯一的解釋可能是它們不是在字符串池中創建的,而是兩個不同的對象。

+2

可能的重複[如何比較Java中的字符串?](https://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – nullpointer

+1

當您創建字符串文字去字符串池。對於其他任何事情,都會創建一個新對象 – Pramod

+1

'=='不比較2個字符串,它比較2個對象包含引用這2個字符串,所以2個對象是不同的。字符串對象是不可變的,所以我認爲它會去字符串池。閱讀更多關於'不可變vs可變對象','字符串池vs堆' –

回答

1

Java自動實習字符串文字。請檢查answer,但是當您使用toUpperCase()時,它會使用new String()創建字符串的新實例,這就是兩個對象不同的原因。

0

「==」運算符比較兩個對象引用的值,以檢查它們是否引用同一個String實例,因此在這種情況下,toUpperCase()創建了一個String實例,這就是爲什麼它返回false。

在另一方面equals()方法比較「」而不管兩個對象引用的內部String實例指的是相同String實例或沒有,所以它返回真。