黑马程序员技术交流社区

标题: java基础知识提问!求解! [打印本页]

作者: 521123270    时间: 2015-3-18 14:49
标题: java基础知识提问!求解!
String类重写过equals方法与Object默认equals方法有什么区别!??比如new StringBuffer("java").equals(new StringBuffer("java"))  返回的是false!!而

new String("java").equals(new String("java"))返回的是true!为什么?求解!!!

作者: 看丶小胖    时间: 2015-3-18 16:18
先明确一点,StringBuffer没有重写Object他爹的equals方法,String重写了。
说一下两个方法的区别
Object类中的equals方法对比的是地址值。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 实现代码如下
equals()方法在object类中定义如下:
  public boolean equals(Object obj) {
return (this == obj);
}
很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。
String类重写了euqals方法,equals方法对比的是对象的内容
这里的代码是java API文档中的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;
}
很明显,这是进行的内容比较,而已经不再是地址的比较

作者: 看丶小胖    时间: 2015-3-18 16:21
然后就显而易见了,StringBuffer类和String类分别创建了两个不同地址值的内容相同的对象,但是他们调用的equals方法做出的动作不一样,懂了么?
作者: 弹剑高歌踏浪行    时间: 2015-3-18 17:38
看丶小胖 发表于 2015-3-18 16:21
然后就显而易见了,StringBuffer类和String类分别创建了两个不同地址值的内容相同的对象,但是他们调用的eq ...

厉害厉害 {:3_46:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2