黑马程序员技术交流社区
标题:
大神帮我看看这个小程序,解释一下他们的区别?
[打印本页]
作者:
wawsc5354524
时间:
2014-8-24 23:14
标题:
大神帮我看看这个小程序,解释一下他们的区别?
package com.itcast.test007;
public class Demo
{
public static void main(String[] args)
{
String a=new String("abc");
String b=new String("abc");
StringBuffer c=new StringBuffer("abc");
System.out.println(a==b);
System.out.println(a.equals(b));
System.out.println(a.equals(c));
}
}
复制代码
作者:
wawsc5354524
时间:
2014-8-24 23:16
我想知道为什么最后一个输出是false?
作者:
wawsc5354524
时间:
2014-8-25 22:00
为啥子没有人给老夫解释一下这个问题呢、
作者:
曾小贤OL
时间:
2014-8-25 23:22
wawsc5354524 发表于 2014-8-25 22:00
为啥子没有人给老夫解释一下这个问题呢、
StringBuffer是一个容器,意识是传入一个abc字符串的地址到StringBuffer里,说以c是abc的地址而不是abc所以为flase
作者:
hejinzhong
时间:
2014-8-26 09:09
(1)我们的上帝类(object)提供了一个equals方法含义如下:
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
用一句通俗的话说,就是这个equals比较的是两变量引用的对象是否是同一个。
(2)都知道String继承object之后,对该方法进行了重写,(API)方法含义如下:
覆盖:类 Object 中的 equals
将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
也用一句话说:这里的equals比较的是两变量引用的对象的内容是否相等。
(3)而StringBuilder继承object后,并没有去覆写该方法。
(4)这个false理解:大的方面说,他们两个原本就不是一个类型的对象,没哟可比性。也可以这么说,也可以认为都向上转型为object,采用的的equals并不是String中的。
复制代码
作者:
zuochbd
时间:
2014-8-26 10:05
本帖最后由 caixingke 于 2014-8-26 10:09 编辑
如有疑问, 应当先查下源代码啊.
String类中的equals(Object):boolean方法的源码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
复制代码
我们可以看到, 如果传向的对象类型不是String的话, 直接返回false
楼上一些说法是不准确的.
如果愿意的话, 我们也可以让传进行的StringBuffer对象返回true的.
当然, 既然JAVA官方认为这不同类型的对象进行equals判断时, 应当返回false, 那我们也遵守这个规则吧.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2