【问题标题】:String Reverse Confusion in java - String - StringBuliderjava中的字符串反向混淆 - String - StringBuilder
【发布时间】:2017-08-13 06:53:27
【问题描述】:
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 条件检查它们是否相等时,它们会打印 “不等于”

这真的很混乱,请解释一下。

【问题讨论】:

  • revStringsbStringBuffer。它们是两种不同的东西。
  • 试试rev.equals(sb.toString())

标签: java string stringbuilder


【解决方案1】:

您正在比较 StringStringBuilder 对象。这永远不会导致 equal 结果! StringBuilder 当前包含与某些字符串相同的内容这一事实并不重要!

换句话说:假设你有一个鸡蛋和一个鸡蛋在一个盒子里。那个盒子(包含一个鸡蛋)是否与另一个鸡蛋“相等”?!

理论上StringBuilder类可以@Overrideequals()方法专门检查它是否等于另一个字符串。但这会相当混乱。因为如果你这样做,你最终会得到:

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

给出不同的结果:

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

最后:StringBuilder 使用继承自 java.lang.Object 的 equals() 的实现。这个实现只是做一个“this == other”检查。

【讨论】:

  • 除非您使用egg.equals(eggInBox.toEgg()),否则它们不是。
  • 不仅仅是令人困惑;这是规范禁止的。
  • @shmosel 好吧,你也可以 @Override String.equals() 。但我希望消息 bad idea 已经出现了。
【解决方案2】:

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

【讨论】:

  • 您似乎在暗示不同类型的对象通常不能彼此相等,这是不正确的。
【解决方案3】:

StringBuilderString 是不同的对象,

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

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

【讨论】:

    【解决方案4】:

    rev 是一个字符串。

    sb 是一个 StringBuilder。

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

    【讨论】:

      猜你喜欢
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多