2017-08-13 122 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。

它们是两个不同的东西,因此决不会是平等的。