Java中的字符串反转混淆 - String - StringBuilder

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和String打印的输出相同,为"gnirtstupni gnirtstupni"。但是当我使用if条件判断它们是否相等时,它们会打印"Not Equal"。这真的很令人困惑,请解释一下。

3
rev 是一个 String,而 sb 是一个 StringBuffer。它们是两个不同的东西。 - Joe C
1
尝试使用 rev.equals(sb.toString()) - Maroun
4个回答

3
你正在比较一个String对象和一个StringBuilder对象。这永远不会导致相等的结果!事实上,StringBuilder当前包含与某个字符串相同的内容并不重要!
换句话说:假设你有一个鸡蛋和一个盒子里的鸡蛋。那个盒子(包含一个鸡蛋)是否“等于”另一个鸡蛋?
理论上,StringBuilder类可以覆盖equals()方法,特别检查它是否等于另一个字符串。但那会相当混乱。因为如果你这样做,最终会得到:
new StringBuilder("a").equals("a") // --> true

与以下结果不同:

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

最后:StringBuilder使用从java.lang.Object继承的equals()实现,这个实现只是进行了一个"this == other"的检查。

1
除非你执行 egg.equals(eggInBox.toEgg()),否则它们不相等。 - Maroun
不仅令人困惑;它还违反了规范。 - shmosel
@shmosel 好吧,你也可以 @Override String.equals()。但我希望“坏主意”的信息已经传达了。 - GhostCat

1

StringBuilderString是两个不同的类,因此这些类型的对象永远不应该相等,无论它们的内容如何。


你似乎在暗示不同类型的对象通常不能相等,但这并不正确。 - shmosel

1

rev 是一个字符串。

sb 是一个 StringBuilder。

它们是两个不同的东西,因此永远不会相等。


1

StringBuilderString是不同的对象,

但如果你想通过字符串进行相等性检查,只需使用toString()

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接