今天测试一段代码,死活不对!遂逐一检查,终于发现是在判断两个String对象是否相等时出错了!我用的是==,导致每次比较都是比较内存地址是否相同,而不是判断内容。为了让自己长点记性,于是有了这篇博客。
首先看下Object的Equals的源码
public boolean equals(Object obj) {
return (this == obj);
}
很明显,如果在我们编写的类中不重写equals方法的话,它和==的作用是一样的。
再看下让我废了一下午时间的String的源码
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;
}
这段代码有几个看点:1.自反性:通过判断this==anObject达到的
2.对称性、传递性、一致性:通过判断两个字符串的内容是否相等达到的
事实上,对于重写equals方法,有些需要注意的地方,详细的可以看《Effective Java 2》的第八和第九条。http://yuedu.baidu.com/ebook/2c57b4717fd5360cba1adbf3.html
http://download.csdn.net/detail/wangneng100/539432
本文详细解析了 Java 中 String 类的 equals 方法实现原理,并对比 Object 类的 equals 方法,阐述了如何正确判断两个 String 对象内容的相等性,以及重写 equals 方法时应注意的问题。

782

被折叠的 条评论
为什么被折叠?



