java StringBuffer equals

尘缘udbwcso 2011-08-05 09:05:08
public class Palindrome {
public static void main(String[] args) {
StringBuffer str1 = new StringBuffer("hjh");
StringBuffer tmp = new StringBuffer(str1);
StringBuffer str2 = new StringBuffer(tmp.reverse());
System.out.println(str1);
System.out.println(str2);
System.out.println(str1.equals(str2));
}
}
最后输出结果是
hjh
hjh
false
不是应该是true的吗?
...全文
170 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
尘缘udbwcso 2011-08-09
  • 打赏
  • 举报
回复
谢谢各位了!
JavaMan_KA 2011-08-07
  • 打赏
  • 举报
回复
StringBuffer 创建的对象 调用equals()方法,是调用Object 老祖宗类的equals()方法,比较的是两个对象的引用地址!StringBuffer 类 并没有重写equals()方法!
因此str1 与 str2 在内存中的地址是不相同的!正解,不多说了。
happysmhzp 2011-08-05
  • 打赏
  • 举报
回复
很经典的问题
向东茶餐厅 2011-08-05
  • 打赏
  • 举报
回复
没有重写equals的话是Object里的方法了 可以看源代码 Object里是==判断的
风尘中国 2011-08-05
  • 打赏
  • 举报
回复
6楼的说法对StringBuffer来说是错误的,StringBuffer并没有重写Object的equals方法,可以直接将JDK的源码拿出来看看就可以了,所以equals方法具体的代码实现是Object的,也就是下面这段
public boolean equals(Object obj) {
return (this == obj);
}

因此对与默认的JDK实现的StringBuffer来说,调用equals和==效果完全等同,这一点上与String存在差别,我们知道String的equals是比较内容的,equals与==结果可能一样也可能不一样。

代码里面你new 了两个对象,在运行时给对象分配的地址不同,所以equals比较结果是不同的,除非你是写成这样
StringBuffer tmp2 = str1; 然后比较str1.equals(tmp2)结果为true,而写成StringBuffer tmp2 = new StringBuffer(str1)比较结果就false
楼主可以结贴了
li26338710 2011-08-05
  • 打赏
  • 举报
回复
??[Quote=引用 6 楼 li26338710 的回复:]

包装类和String类已经重写了equals()方法,这些类的equals()方法比较的是值!引用 4 楼 is_zhoufeng 的回复:

引用 1 楼 cbxjj 的回复:
你每次都新new了一个对象怎么可能是true

用equest比较的是内容,==比较的才是地址
[/Quote]
malihom 2011-08-05
  • 打赏
  • 举报
回复
3楼说的没错。
StringBuffer直接继承Object,StringBuffer是没有重写equals方法的,所以根据Object的equals方法,比较的肯定是两个对象的引用地址,所以是false
剑神一笑 2011-08-05
  • 打赏
  • 举报
回复
StringBuffer没有重写equals方法
就是对象的比较 肯定是false了
[Quote=引用 6 楼 li26338710 的回复:]
包装类和String类已经重写了equals()方法,这些类的equals()方法比较的是值!

引用 4 楼 is_zhoufeng 的回复:

引用 1 楼 cbxjj 的回复:
你每次都新new了一个对象怎么可能是true

用equest比较的是内容,==比较的才是地址
[/Quote]
li26338710 2011-08-05
  • 打赏
  • 举报
回复
包装类和String类已经重写了equals()方法,这些类的equals()方法比较的是值![Quote=引用 4 楼 is_zhoufeng 的回复:]

引用 1 楼 cbxjj 的回复:
你每次都新new了一个对象怎么可能是true

用equest比较的是内容,==比较的才是地址
[/Quote]
_jerrytiger 2011-08-05
  • 打赏
  • 举报
回复
不过。这里StringBuffer比较的却是是地址。楼上已经说了,它没有重写。equals方法。
String类得.equals()方法。比较的才是内容。
_jerrytiger 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cbxjj 的回复:]
你每次都新new了一个对象怎么可能是true
[/Quote]
用equest比较的是内容,==比较的才是地址
li26338710 2011-08-05
  • 打赏
  • 举报
回复
StringBuffer 创建的对象 调用equals()方法,是调用Object 老祖宗类的equals()方法,比较的是两个对象的引用地址!StringBuffer 类 并没有重写equals()方法!
因此str1 与 str2 在内存中的地址是不相同的!
gentleboy2009 2011-08-05
  • 打赏
  • 举报
回复
这个equals比较的是两个对象的地址!地址不一样所以false
剑神一笑 2011-08-05
  • 打赏
  • 举报
回复
你每次都新new了一个对象怎么可能是true

62,615

社区成员

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

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