使用StringBuffer.reverse后为什么equals()为真?

时间:2014-06-19 17:31:16

标签: java equals reverse stringbuilder stringbuffer

p.equals(w)总是成真。为什么?

http://ideone.com/JqLCDi

    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");

}

    }
}

3 个答案:

答案 0 :(得分:4)

public synchronized StringBuffer reverse() {
super.reverse();
return this;
}

Reverse将反转String并将其设置在同一个StringBuffer对象中。所以它总是一样的。

所以

p.reverse();

与说

相同
p = p.reverse();

然后如果你这样做

StringBuffer w=p.reverse();

pw会对同一个对象产生影响。不用说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()))