public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer("a");
        StringBuffer s2 = new StringBuffer("a");
        if(s1.equals(s2))System.out.println("true");
        else System.out.println("false");
        
        if(s1==s2)System.out.println("true");
        else System.out.println("false");
    }
大哥帮帮忙!!
为什么都是输出false,String 和 stringbuffer有什么区别。和共同点呢,,小弟在次谢谢了!

解决方案 »

  1.   

    String:定义的字符串一般情况下不轻易改变。可看作固定长度的字符串变量。
    StringBuffer:定义的字符串可以随时改变。可看作不固定长度的字符串变量。
    String定义的字符串要比StringBuffer定义的字符串消耗资源多一点。
      

  2.   

    一、String的equals方法是覆盖Object的,所以String a=new String("ss");String b=new String("ss"); 生成了两个对象,但是a.equals(b)=true,比较的是值。
    二、StringBuffer的equals方法没有覆盖Object的方法,所以StringBuffer a=new StringBuffer("ss");StringBuffer b=new StringBuffer("ss");,生成了两个对象,
    a.equals(b)=false,比较的是地址。三、等号比较的是地址,String a = "a";String b=a;只生成了一个对象a==b true。
    StringBuffer a=new StringBuffer("a");StringBuffer b = a; 也是生成一个对象a==b true。
    四、String a="ss";String b="ss"; a.equals(b)=true a==b true因为也是一个对象。这是因为编译时只产生了一个对象"ss"。String a=new String("ss");String b=new String("ss");a.equals(b)=true,没有疑问,a==b false。因为a,b是在运行时才产生的对象,产生了2个对象。 
    http://bbs.chinajavaworld.com/thread.jspa?threadID=54173&start=45&tstart=0下边是StringBuffer的equals方法:
        public boolean equals(Object obj) {
    return (this == obj);
        }
    下边是String的equals方法:       public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
    return false;
    }
    return true;
        }
    }
    return false;
        }
        }
      

  3.   

    new StringBuffer("a"); 每次都在内存产生新的对象!所以s1 , s2是两个不同对象!而stringBuffer的equal方法是从Objec继承来的,所以两个都是false!
      

  4.   

    String:定义的字符串一般情况下不轻易改变。可看作固定长度的字符串变量。 
    StringBuffer:定义的字符串可以随时改变。可看作不固定长度的字符串变量
      

  5.   

    StringBuffer: A thread-safe, mutable sequence of characters.
    同时它继承的Object的equals方法是比较object reference的 类同==
      

  6.   

    明显的告诉你:它们都是处理字符串的类,但是它们有一个最大的区别,那就是,String对象是存储你不能改动的文本字符 
    串,相反,如果你希望改动,则应使用StringBuffer类作为替换. 
    eg1: 
    ...... 
    //omit some code 
    String s1="You are hired!"; 
    System.out.println(s1.replace('h','f'));//用f把字串中的h替换了 
    System.out.println(s1); 
    ...... 
    //omit some code 
    运行结果: 
    You are fired! 
    You are hired! 
    结果分析: 
    从结果,明显可知,s1的值并没有被改变,而第一行结果只是屏幕内容的替换. 
    eg2: 
    ...... 
    //omit some code 
    StringBuffer s2=new StringBuffer("Hello from Java!"); 
    s2.replace(6,10,"to"); 
    System.out.println(s2); 
    ...... 
    //omit some code 
    运行结果: 
    Hello to Java! 
    结果分析: 
    显然,s2的值已改变.以上为转载~~~~~~~
      

  7.   

    String创建后无法改变
    StringBuffer可以改变
      

  8.   

    String 的equals方法是比较值是否相等.StringBuffer的equals方法是比较内存地址是否相同??
      

  9.   

       学习了 没想到 他们复写的方法还有如此的不同改看看API  了
      

  10.   

    StringBuffer的equals方法直接调用Object的equals方法
    反编译的代码:
        public boolean equals(Object obj) {
    return (this == obj);
        }很明显StringBuffer的equals()方法和==都是比较地址的String的equals是被覆盖的
    反编译的代码:
        public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
    return false;
    }
    return true;
        }
    }
    return false;
        }
      

  11.   

    受教了,StringBuffer的equals还是比较的地址
      

  12.   

    StringBuffer是长度可变的字符串,对其的任何修改都不会产生新的对象
    String是定长的字符串,对其的任何修改都会产生新的对象,消耗内存
      

  13.   

    默认情况下   equals()和== 都是对引用的比较
    不过String覆盖了Object的equals() 覆盖后比较对象的值 还有基本类型的包装类也是如此
    而StringBuffer的equals还是比较对象的引用(是否指向同一对象)