2014-10-05 84 views
0
class test { 

public static void main(String[] args) { 
    String a = "Hiabc"; 
    String b = "abc"; 
    String c = "abc"; 
    System.out.println(a.substring(2,5)==b); 
    System.out.println(b==c); 
} 
} 

output: 
false 
true 

據我瞭解,Java的==尋找兩個比較對象的地址。然而,我不明白爲什麼b == c是真的,因爲它們必須有不同的地址。另外,如果b == c,那麼爲什麼是a.substring(2,5),這是「abc」== b false?在java中的子串和字符串之間的區別

+1

因爲'substring'創建一個**新對象**。 'b'和'c'指池中的*相同*字符串。 – Maroun 2014-10-05 08:42:22

+0

你能解釋更多關於「泳池」嗎?你的意思是Java有所有的字符串庫? – foothill 2014-10-05 08:55:13

+0

谷歌它,有關於Java字符串池的無限資源。 – Maroun 2014-10-05 08:57:37

回答

0

切勿在Java中將字符串與==相比較。 改爲使用.equal或.equalIgnoreCase方法。

a.substring(2,5)和b之間的區別是因爲substring創建另一個String對象,它位於與b不同的位置。這不是關於字符...

1

據我瞭解,Java的==尋找兩個比較對象的地址。

幾乎正確。 Java使用引用而不是地址,例如參考是強類型:請參見https://softwareengineering.stackexchange.com/questions/141834/how-is-a-java-reference-different-from-a-c-pointer

爲什麼b == c爲真

變量bc初始化用相同的字符串引用,因爲它們引用同一string literal​​。

爲什麼子字符串表達式不引用字符串文字「abc」?

由於substring()的Javadoc說

返回一個新字符串,它是此字符串的一個子。

因此,該方法不能確保從常量池返回字符串的引用。如果你想要這個,你所要做的

a.substring(2,5).intern() 

,比

a.substring(2,5).intern()==b 

true

+0

爲什麼子字符串表達式不引用字符串文字「abc」? – foothill 2014-10-05 08:54:31

相關問題