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

Why is this reversed StringBuilder not equal to the original String, when it is a palindrome?

我试图使用 StringBuilderreverse() 来检查字符串是否为回文。对于像 "chan" 这样没有对称性的词,它正确地 returns false,但对于像 "madam".[= 这样的真正的回文,它也是 returns false 16=]

代码:

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

我是 运行 Eclipse Neon 和 Java 8.

如果要比较字符串,需要使用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 对象 str2 与字符串进行比较,而不是比较两个字符串。 此外,不需要 trim(),因为您的字符串仅包含字母。

str.reverse().toString().trim()String,所以它不能等于 StringBuilder

尝试比较 2 Strings:

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

此行正在比较 str2StringBuilder 的实例与 String 的实例:

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

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

在这种情况下,情况更糟,因为StringBuilder根本没有覆盖equals方法. 如果您选中 the class documentation,您会看到 equals 列为从 Object 继承的方法之一。所以它只会在传递相同的对象实例时 return 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)

所以你不能用这种方式比较任何 StringBuilder实例。要进行比较,请将反转结果转换回普通 String:

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

注意:如果您想 trim() 用户输入,请尽早进行。如果你trim后反转,你将不得不trim比较两半。