p.equals(w)总是成真。为什么?
import java.io.*;
import java.util.Scanner;
class TestClass {
public static void main(String args[] ) throws Exception {
Scanner s=new Scanner(System.in);
int t=s.nextInt();
while(t-->0){
String k=s.next();
StringBuffer p=new StringBuffer(k);
int c=0;
StringBuffer w=p.reverse();
if(p.equals(w)){
System.out.print(p.equals(w));
for(int i=0;i<p.length();i++)
{
if(p.charAt(i)=='1'||p.charAt(i)=='0'||p.charAt(i)=='8') { c++;}
}
}
if(c==p.length())System.out.println("YES");
else System.out.println("NO");
}
}
}
答案 0 :(得分:4)
public synchronized StringBuffer reverse() {
super.reverse();
return this;
}
Reverse将反转String并将其设置在同一个StringBuffer对象中。所以它总是一样的。
所以
p.reverse();
与说
相同p = p.reverse();
然后如果你这样做
StringBuffer w=p.reverse();
p
和w
会对同一个对象产生影响。不用说equals()
将返回true
。
您可以在StringBuffer
上的反向操作之前和之后存储字符串对象,然后对它们使用equals()。 toString()
返回新的String对象。
public synchronized String toString() {
return new String(value, 0, count);
}
答案 1 :(得分:2)
与String不同,StringBuffer 1 是可变类型。在此设计之后,StringBuffer.reverse 修改原始对象,然后返回相同的(当前)StringBuffer实例;返回相同的实例允许方法链接:
[reverse]导致该字符序列被序列的反向替换[并返回]对此[StringBuffer]对象的引用。
因此
StringBuffer w=p.reverse();
在语义上等同于
p.reverse(); // side-effect! reverses content
StringBuffer w == p;
// w == p -> true (same object), implies w.equals(p) -> true
解决此问题的一种方法是为w创建new StringBuffer实例,然后反转。
StringBuffer w = new StringBuffer(p);
// w == p -> false, w.equals(p) -> true
p.reverse();
// w == p -> false, w.equals(p) -> false
如果只需要String,则应用相同的规则/逻辑 - 在反转StringBuffer之前创建数据的新对象/副本。
String s = p.toString()
// s == p -> false, s.equals(p) -> true
p.reverse();
// s == p -> false, s.equals(p) -> false
虽然我怀疑这是实际任务,但请考虑p.toString.equals(p.reverse())
,它也遵循前面的逻辑。
boolean reversed = p.toString() // "s", new String / data copy
.equals(
p.reverse() // "p", reverse done after copy
);
1 StringBuffer是旧的,除非需要同步属性,否则请使用StringBuilder:
[StringBuilder]设计用作StringBuffer的替代品,用于单个线程使用字符串缓冲区的地方。在可能的情况下,建议使用此类优先于StringBuffer,因为它在大多数实施中都会更快。
答案 2 :(得分:1)
在if条件中使用此
if(p.toString().equals(p.reverse().toString()))