A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 521123270 中级黑马   /  2015-3-18 14:49  /  896 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String类重写过equals方法与Object默认equals方法有什么区别!??比如new StringBuffer("java").equals(new StringBuffer("java"))  返回的是false!!而

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

3 个回复

倒序浏览

回帖奖励 +3

先明确一点,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;
}
很明显,这是进行的内容比较,而已经不再是地址的比较
回复 使用道具 举报
然后就显而易见了,StringBuffer类和String类分别创建了两个不同地址值的内容相同的对象,但是他们调用的equals方法做出的动作不一样,懂了么?
回复 使用道具 举报
看丶小胖 发表于 2015-3-18 16:21
然后就显而易见了,StringBuffer类和String类分别创建了两个不同地址值的内容相同的对象,但是他们调用的eq ...

厉害厉害 {:3_46:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马