2017-08-13 158 views
3
String str="inputstring"; 
StringBuilder sb=new StringBuilder(str); 
String rev=sb.reverse().toString(); 
//System.out.println(sb+" "+rev);    //this prints the same reverse text 
if(rev.equals(sb)) 
    System.out.println("Equal"); 
else 
    System.out.println("Not Equal"); 

當我打印的代碼的StringBuilder和字符串打印相同的輸出「gnirtstupni gnirtstupni」,但是當我檢查它們是否相等使用如果條件,他們打印「不等於」「不等於」字符串反向混淆在Java中 - 字符串 - StringBulider

這真是令人困惑,請解釋一下。

+3

'rev'是一個'String'。 'sb'是一個'StringBuffer'。他們是兩個不同的東西。 –

+1

嘗試'rev.equals(sb.toString())'。 – Maroun

回答

3

你是一個比較字符串一個的StringBuilder對象。那永遠不會導致等於的結果! StringBuilder當前包含與某些字符串相同的內容並不重要!

換句話說:假設你在一個盒子裏有一個雞蛋和一個雞蛋。那個盒子(包含一個雞蛋)「等於」那個雞蛋?!

理論上StringBuilder類可以@Override equals()方法來專門檢查它是否等於另一個字符串。但那會讓人感到困惑。因爲如果你這樣做,你結束了:

new StringBuilder("a").equals("a") // --> true 

給出不同的結果:

"a".equals(new StringBuilder("a")) // --> false 

最後:StringBuilder使用從java.lang.Object繼承了equals()實施。這個實現只是做一個「這個==其他」檢查。

+1

除非你做'egg.equals(eggInBox.toEgg())',否則它們不是。 – Maroun

+0

不僅僅是混亂;這是規範禁止的。 – shmosel

+0

@shmosel那麼,你可以@覆蓋String.equals()了。但我希望消息*壞主意*已經過去了。 – GhostCat

1

StringBuilderString是兩個不同的類別,因此這些類型的對象不應該彼此相等,無論其內容如何。

+0

你似乎暗示着不同類型的對象通常不能相互對等,這是不正確的。 – shmosel

1

StringBuilderString是不同的對象,

但是如果你想檢查由字符串相等。只需使用toString()

if(rev.equals(sb.toString())) 
     System.out.println("Equal"); 
    else 
     System.out.println("Not Equal"); 
1

rev是一個字符串。

sb是一個StringBuilder。

它們是兩個不同的東西,因此決不會是平等的。