当它是回文时,为什么这个反转的 StringBuilder 不等于原来的 String?
Why is this reversed StringBuilder not equal to the original String, when it is a palindrome?
我试图使用 StringBuilder
和 reverse()
来检查字符串是否为回文。对于像 "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 String
s:
boolean res=str2.toString().equals(str.reverse().toString().trim());
此行正在比较 str2
,StringBuilder
的实例与 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比较两半。
我试图使用 StringBuilder
和 reverse()
来检查字符串是否为回文。对于像 "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 String
s:
boolean res=str2.toString().equals(str.reverse().toString().trim());
此行正在比较 str2
,StringBuilder
的实例与 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比较两半。