package t001;public class C01 { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
         StringBuffer b1 = new StringBuffer("abc");
         StringBuffer b2 = new StringBuffer("abc");
         System.out.println(b1==b2);  //false
         System.out.println(b1.equals(b2)); //false
         
         StringBuilder b3 = new StringBuilder("def");
         StringBuilder b4  = new StringBuilder("def");
         System.out.println(b3==b4);  //false
         System.out.println(b3.equals(b4)); //false
}}为什么都是false?
尤其是用equals 方法也是false
谁提点一下 ? 谢谢 

解决方案 »

  1.   

    "==" 是false是因为比较的是两个不同的对象,地址不一样,所以是false。
    "equals" 是false是因为StringBuffer类本身没有覆盖Object类的equals方法,即使用的是equals的默认实现,就是直接使用"==",所以结果是和"=="一样的。
      

  2.   

    StringBuffer和String不同,它没有重写Object的equals()方法,所以StringBuffer的equals()就是Object的equals(),等价于==操作。
      

  3.   

    那也就是说,StringBuffer 的== 和 equals 的这两个方法,其实在干同样的事情?
    他们的结果肯定是一致的? 对吗?
      

  4.   

    楼上理解的不错。对于SB来说,==和equals起到的作用一样。
      

  5.   

    楼主理解不对
    ==代表内存地址比较
    equals代表各地址里的值进行比较
    他们说的equals方法没被重写,所以用Object类的equals方法,该方法默认返回false
      

  6.   

    因为StringBuffer 创建一个对象时候, 其实会分配一个这个对象初值外加一个16位的地址的值,就算两个对象初值一样,但是他们的地址存放肯定不一样的,所以无论用== 还是用equals都不会相等.
      

  7.   

    ...又被搞晕了
    == 比较的是什么?
    equals 比较的是什么?
    谁说的清楚点?
      

  8.   

    这么讲吧,StringBuffer 的 == 和equals 的实现是一样的,equals里的方法就是用 == ,这么说你懂了吧?
      

  9.   

    ==比较的是内存地址的值。(换个地方就不是它了)new相当于又分配一个内存空间。所以==是false,但是如果采用string的equals方法比对的话是true.
    但是StringBuffer不能重写string的equals方法。所以equals比对也是false.equals比较的是所在值是否相等。(换个地方值没变就认为还是它)
      

  10.   


    == 比较2个对象是否占用同一个物理地址,如果是占用同一个物理地址的话,就是说这两个对象是同一个对象,返回值为true;
        如果不是占用同一个物理地址的话,就返回false;
    equals 是java强烈建议任何类都要重写的一个方法(当然你也可以不重写,这只是建议而已),equals()方法的返回值是类设计者根据其设计意图指定的,比如,两个字符串,你希望只要他们的字面值一样(尽管他们占用了不同的物理地址),equals()方法就返回true,这时你就要重写string类的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;
        }
    object类的equals()方法的源码是 public boolean equals(Object obj) {
    return (this == obj);
        }
    这是一个快速比较,它直接使用了==。任何类如果没有重写equals()方法,它将使用object类的equals()方法,也就是说,只要对象的物理地址不同,它就永远返回false;因此,强烈建议楼主在使用的时候去查看一下所用类有没有重写equals()方法
      

  11.   

    这StringBuffer是一种对象,不能用==来判断
    还有也不能用equals,这是用来判断字符串的
    这里有几种办法来解决,
    1。重写对象的大小比较,=号这个方法
    2. 我一直没有用这个来比较stringbuffer所以不知道StringBuffer有没有实现了camparable接口,不知道能不能用这个方法,
    3. 最简单的就是b3.toString().equals(b4.toString());
      

  12.   


    3方法可用;
    1方法不可,java不支持操作符重载,(+号除外,已经在字符串连接时重载过了。这是写java的人干的事,我们使用java的人是不行的)