stringbuffer ==, equals 请指点

livehejie 2008-03-19 08:20:54

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
谁提点一下 ? 谢谢
...全文
286 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kkkdyc 2008-03-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 frank_wu 的回复:]
这StringBuffer是一种对象,不能用==来判断
还有也不能用equals,这是用来判断字符串的
这里有几种办法来解决,
1。重写对象的大小比较,=号这个方法
2. 我一直没有用这个来比较stringbuffer所以不知道StringBuffer有没有实现了camparable接口,不知道能不能用这个方法,
3. 最简单的就是b3.toString().equals(b4.toString());
[/Quote]

3方法可用;
1方法不可,java不支持操作符重载,(+号除外,已经在字符串连接时重载过了。这是写java的人干的事,我们使用java的人是不行的)
考拉之爱 2008-03-19
  • 打赏
  • 举报
回复
这StringBuffer是一种对象,不能用==来判断
还有也不能用equals,这是用来判断字符串的
这里有几种办法来解决,
1。重写对象的大小比较,=号这个方法
2. 我一直没有用这个来比较stringbuffer所以不知道StringBuffer有没有实现了camparable接口,不知道能不能用这个方法,
3. 最简单的就是b3.toString().equals(b4.toString());
kkkdyc 2008-03-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 livehejie 的回复:]
...又被搞晕了
== 比较的是什么?
equals 比较的是什么?
谁说的清楚点?
[/Quote]

== 比较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()方法
ashutc 2008-03-19
  • 打赏
  • 举报
回复
==比较的是内存地址的值。(换个地方就不是它了)

new相当于又分配一个内存空间。所以==是false,但是如果采用string的equals方法比对的话是true.
但是StringBuffer不能重写string的equals方法。所以equals比对也是false.

equals比较的是所在值是否相等。(换个地方值没变就认为还是它)
kanebluba 2008-03-19
  • 打赏
  • 举报
回复
这么讲吧,StringBuffer 的 == 和equals 的实现是一样的,equals里的方法就是用 == ,这么说你懂了吧?
livehejie 2008-03-19
  • 打赏
  • 举报
回复
...又被搞晕了
== 比较的是什么?
equals 比较的是什么?
谁说的清楚点?
kanebluba 2008-03-19
  • 打赏
  • 举报
回复
因为StringBuffer 创建一个对象时候, 其实会分配一个这个对象初值外加一个16位的地址的值,就算两个对象初值一样,但是他们的地址存放肯定不一样的,所以无论用== 还是用equals都不会相等.
qizhe6783 2008-03-19
  • 打赏
  • 举报
回复
楼主理解不对
==代表内存地址比较
equals代表各地址里的值进行比较
他们说的equals方法没被重写,所以用Object类的equals方法,该方法默认返回false
psyl 2008-03-19
  • 打赏
  • 举报
回复
楼上理解的不错。对于SB来说,==和equals起到的作用一样。
livehejie 2008-03-19
  • 打赏
  • 举报
回复
那也就是说,StringBuffer 的== 和 equals 的这两个方法,其实在干同样的事情?
他们的结果肯定是一致的? 对吗?
duzhonghua 2008-03-19
  • 打赏
  • 举报
回复
学习!!!!!!!!!
Dan1980 2008-03-19
  • 打赏
  • 举报
回复
StringBuffer和String不同,它没有重写Object的equals()方法,所以StringBuffer的equals()就是Object的equals(),等价于==操作。
favorite7w 2008-03-19
  • 打赏
  • 举报
回复
"==" 是false是因为比较的是两个不同的对象,地址不一样,所以是false。
"equals" 是false是因为StringBuffer类本身没有覆盖Object类的equals方法,即使用的是equals的默认实现,就是直接使用"==",所以结果是和"=="一样的。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧