2009-12-02 71 views
0
String string1 = "Hi there"; 
String string2 = "Hi"; 
String string3 = "Hi"; 

System.out.println(string1.substring(0, string2.length()) == string2); //1 
System.out.println(string1.substring(0, string2.length()).equals(string2)); //2 
System.out.println(string1.substring(0, string2.length()).compareTo(string2)); //3 
System.out.println(string2 == string3); //4 
System.out.println(string2.substring(0) == string3); //5 
System.out.println(string2.substring(0) == string3.substring(0)); //6 

比較字符串給我的輸出:在Java

false 
true 
0 
true 
true 
true 

我真的不明白的第一行,爲什麼它給我假?

如果我添加一個空格串2並此行中我得到錯誤的,但如果我添加沒有空格,我得到真正:

System.out.println(string2.substring(0, string3.length()) == string3); 

爲什麼要排隊1給我假,但6號線是真實的,但如果我添加一個空格,以STRING2這是假的..

感謝=)

+5

這是怎麼回事? http://stackoverflow.com/search?q=Comparing+strings+in+java在輸入問題信息時,您沒有看到列表中包含主題下的所有鏈接的列表嗎?你是否打算按照建議的鏈接?爲什麼不? – BalusC 2009-12-02 15:19:25

回答

14

有幾件事情在那裏。

當你聲明兩個字符串等於「Hi」時,java會優化它以引用相同的字符串對象(所以它不必存儲相同的字符串兩次)。

「==」比較引用。在第1行中使用子字符串時,創建的字符串對象具有與string2不同的引用。

在第6行,我想substring(0)有一個優化,它知道它可以返回原始字符串,因此這些引用是相等的。

+0

+1的詳細解釋 – Yacoby 2009-12-02 15:22:13

+0

有這些優化總是在Java?我似乎回想起在Java 2中可能沒有返回不同結果的練習,但是我的記憶有點模糊。 – FrustratedWithFormsDesigner 2009-12-02 15:26:57

+2

也許,也許不是。無論哪種方式,這是一個完美的例子,你應該永遠不要依靠這樣的優化。如果你需要比較'String',* always *使用'equals()',*永遠不要使用'=='! – Bombe 2009-12-02 17:12:24

4

如果兩個對象是相等的==操作符是檢查(是他們引用同一個對象),而不是比較值containes在其中。

+0

那麼,爲什麼4,5和6迴歸真實? – 2009-12-02 15:20:17

+0

@Tor:Jean Barmash擊敗了我; – FrustratedWithFormsDesigner 2009-12-02 15:25:58

+0

這是馬虎而混淆的術語:==運算符不檢查兩個OBJECTS是否相等;它檢查兩個變量是否引用同一個對象。變量不是對象 - 變量是對象的引用。 – Jesper 2009-12-02 15:53:44

7

如果你想比較字符串,那麼你應該使用String.equals()(或String.equalsIgnoreCase())的方法。比較==只有在兩個參考指向同一個對象時纔會告訴您。在你的例子中是這樣的:string2和string3指向字符串"Hi"的相同實例(爲什麼Java應該在編譯時創建兩個完全相同的字符串)

+1

+1。另外值得注意的是,通常情況下,對於從方法返回的對象的實例幾乎沒有保證 - 如果方法可以自由使用實例緩存,使用動態代理等,方法通常可以做更好的事情。重要的是不要掛在對象平等上,在一般情況下使用'equals()',只有在確實需要的時候才比較引用。 – 2009-12-02 15:24:06

1

==比較引用 - 字符串的地址不是它的價值。爲了比較字符串,你應該使用equals。 JVM將處理新的String對象,所以如果存在一個相同值的對象(string2 vs string3),它可能引用同一個對象。

1

==運算符將2個引用與相同的字符串相比較。

String類有兩個方法,你應該使用比較兩個字符串是否相等:

String1.equals(String2); 

返回true如果字符串1和字符串是相同的(包括字母的大小寫)。

如果你不關心的話,那麼你可以使用:

String1.equalsIgnoreCase(String2); 

如果字符串1和字符串是相等的,無論情況(顯然)這個返回true。

2

Java爲 測試相等提供了兩個基本機制。可以使用「==」 運算符來測試基本值是否相等,也可以是 用於確定兩個對象是否指向相同的 基礎對象。對於Java對象, 如果參數等於調用該方法的對象 ,則equals(Object)方法將返回 ,其中 對象的類語義定義了相等性。

由於字符串是對象,如果 兩個字符串具有相同的內容,即 ,在同 順序相同的字符的 等於(Object)方法將返回true。 ==運算符只有在 爲真時,如果兩個字符串引用指向 相同的基礎字符串對象。由equals(Object)方法測試 當 表示 相同內容因此兩個字符串將是相等的,但將僅 通過等於當與== 操作者測試它們是否實際上是相同的 對象。

從JavaTechniques引用:http://javatechniques.com/public/java/docs/basics/string-equality.html

1

線4,5,和6是true因爲在substring(int, int)java.lang.String的方法中,以下行的:

return ((beginIndex == 0) && (endIndex == count)) ? this : 
    new String(offset + beginIndex, endIndex - beginIndex, value); 

由於子你是請求開始於0並且具有完整字符串的長度,您只需返回對字符串本身的引用,以便a.substring(0) == a