本帖最后由 jiyixuan 于 2012-6-14 00:41 编辑
"关于‘==’是只负责基本数据类型比较,和引用对象地址比较,而equals则是比较两个对象间的内容是否一样"。(这个说法比较片面)
每个类都是使用Object作为超类的,所有对象,包括数组也实现这个类的方法。
对于Object类中的方法如下: - public boolean equals(Object obj) {
- return (this == obj);
- }
复制代码表明说对于一个普通类,没有覆盖equals方法时。该类的比较“==”与equals操作的结果是相同的。
而为什么在字符串中比较,我们强调使用equals来比较内容,使用“==”来比较是否为同一对象。
是因为String类中的equals方法已经覆盖如下:
- 1. public boolean equals(Object anObject) {
- 2. if (this == anObject) {
- 3. return true;
- 4. }
- 5. if (anObject instanceof String) {
- 6. String anotherString = (String)anObject;
- 7. int n = count;
- 8. if (n == anotherString.count) {
- 9. char v1[] = value;
- 10. char v2[] = anotherString.value;
- 11. int i = offset;
- 12. int j = anotherString.offset;
- 13. while (n-- != 0) {
- 14. if (v1[i++] != v2[j++])
- 15. return false;
- 16. }
- 17. return true;
- 18. }
- 19. }
- 20. return false;
- 21. }
复制代码根据字符串中的每一个字符做出比较(字符比较相当于基础数据类型比较)。
而对于hashCode()是否要覆盖,主要是在集合类中使用,例如set中为了保持唯一性,判断一个对象是否相等的时候,除了通过equals的值外,还需要通过判断hashCode是否相等即:对象相等,必然hashCode都应该相等hashCode相等,对象未必相等。
|