当前位置: 首页 > 知识库问答 >
问题:

为什么这个反向StringBuilder不等于原始String,当它是回文时?

融伯寅
2023-03-14

我试图使用StringBuilderreverse()检查String是否是回文。对于像“chan”这样没有对称性的单词,它正确地返回false,但它也为真正的回文(如“madam”)返回false

代码:

StringBuilder str = new StringBuilder("madam");
StringBuilder str2 = new StringBuilder(str);
boolean res = str2.equals(str.reverse().toString().trim());
System.out.println(str + " " + str2);
System.out.println(res);

输出:

madam madam
false

我正在使用Java8运行Eclipse Neon。

共有3个答案

燕照
2023-03-14

此行将str2StringBuilder的实例)与String的实例进行比较:

boolean res = str2.equals(str.reverse().toString().trim());

通常,两个不同类的对象总是说它们不相等,因为它们通常不被编程为知道如何检查不同类型对象的内容。(在某些情况下,它被指定工作,例如java.util.List的不同实现)

在这种情况下,甚至更糟,因为< code>StringBuilder根本不覆盖< code>equals方法。如果您查看类文档,您会看到< code>equals被列为从< code>Object继承的方法之一。因此,只有在传递相同的对象实例时,它才会返回< code > true ;它从不比较内容。

StringBuilder sb1 = new StringBuilder("abc");
StringBuilder sb2 = new StringBuilder(sb1);
System.out.println(sb1.equals(sb1)); // true; same object
System.out.println(sb1.equals(sb2)); // false; different objects (same content)

因此,您无法以这种方式比较任何字符串生成器实例。要进行比较,请将反转的结果转换回普通字符串

String input = "madam";
input = input.trim();
String reversed = new StringBuilder(input).reverse().toString();
System.out.println(input + " " + reversed);
System.out.println(input.equals(reversed));

注意:如果您想要<code>trim()

曹嘉许
2023-03-14

如果要比较字符串,需要使用<code>str2.toString():

boolean res=str2.toString().equals(str.reverse().toString().trim());

完整的解决方案:

StringBuilder str=new StringBuilder("madam");
StringBuilder str2=new StringBuilder(str);
boolean res=str2.toString().equals(str.reverse().toString().trim());
System.out.println(str+" "+str2);
System.out.println(res);

输出:

 madam madam true

问题在于,您将StringBuilder对象<code>str2<code>与字符串进行比较,而不是比较两个字符串。此外,trim()是不需要的,因为字符串只包含字母。

应煌
2023-03-14

str.reverse(). toString(). trim()是一个String,因此它不能等于StringBuilder

尝试比较 2 个字符串

boolean res=str2.toString().equals(str.reverse().toString().trim());
 类似资料:
  • 我正在尝试创建一个函数,该函数接受字符串“s”以检查它是否是回文: 出于某种原因,如果我将 return 语句更改为 this,对于某些非回文,它将返回 true 而不是 false: 我不知道为什么改变反转顺序会导致这种情况。

  • 问题内容: 以下是两种附加方法: 我的问题是-什么时候使用更有效?假设有10个字符串,我需要创建其中一个。 问题答案: 因为StringBuilder可以“附加”一个字符串,而不是每次创建一个新对象时都串联两个字符串。即使对字符串使用+ =运算符,也会创建一个新对象。仅当您尝试连接大量字符串时,此优点才变得重要。If也被认为更具可读性。

  • 问题内容: 为什么大多数其他数据类型都没有Java的String基本类型? 问题答案: 字符串是一个对象,根本不是原始类型,只是一个字符数组。James Gosling的访谈 摘录摘述了Java中根本存在原始类型的原因,这很有趣。 Bill Venners: Java为什么会有原始类型?为什么不是所有事物都只是一个对象? James Gosling: 完全是效率问题。有各种各样的人已经建立了以in

  • 问题内容: 我是第一次遇到,很惊讶,因为Java已经具有一个非常强大的类,可以追加。 为什么要上第二堂课? 在哪里可以了解更多信息? 问题答案: 不允许附加。你在上调用的每个方法都会创建一个新对象并返回它。这是因为String它是不可变的-无法更改其内部状态。 另一方面是可变的。调用时,它会更改内部char数组,而不是创建新的字符串对象。 因此,拥有: 而不是,这将创建500个新的字符串对象。 请

  • 以下是输出 第1行返回,第3行返回false。 我不明白为什么编译器不认为“name1”和“sb”包含相同的值 类似地,编译器并不认为“s”和“sb”包含相同的字符串(都是非原语)。 有人能解释一下line1和line3的输出吗?

  • 这篇文章主要介绍了String、StringBuffer、StringBuilder的区别详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。放假在家里休息,闲来无事,想巩固巩固自己的基础知识。 Java中提供了两个类String和StringBuffer,它们用于储存和操作字符串