Java Object 类分析
2011-03-22 14:52
190 查看
Object类中的hashCode和equals函数有着非常紧密的逻辑关系。当然这个逻辑关系是人赋予它的。在没有覆盖这两函数函数之前,hashCode返回的是地址,equals比较的也是两个应用对象的地址。 也就是说如果两个对象equals,那么hashcode值也应该一样。
对象内容的比较才是设计equals()的真正目的,Java语言对equals()的要求如下,这些要求是必须遵循的。否则,你就不该浪费时间:
对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
反射性:x.equals(x)必须返回是“true”。
类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
hashCode()的返回值和equals()的关系如下:
如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。
如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。
在Object类中定义的几个hashCode约定如下:
1. 在同一应用中,一个对象的hashCode函数在equals函数没有更改的情况下,无论调用多少次,它都必须返回同一个整数。
2. 两个对象如果调用equals函数是相等的话,那么调用hashCode函数一定会返回相同的整数。
3. 两个对象如果调用equals函数是不相等的话,那么调用hashCode函数不要求一定返回不同的整数。
我们在改写equals 和 hashCode 函数的时候,一定要遵守如上3条约定,在改写equals的同时也改写hashCode的实现,这样才能保证得到正确的结果。
对象内容的比较才是设计equals()的真正目的,Java语言对equals()的要求如下,这些要求是必须遵循的。否则,你就不该浪费时间:
对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
反射性:x.equals(x)必须返回是“true”。
类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
hashCode()的返回值和equals()的关系如下:
如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。
如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。
在Object类中定义的几个hashCode约定如下:
1. 在同一应用中,一个对象的hashCode函数在equals函数没有更改的情况下,无论调用多少次,它都必须返回同一个整数。
2. 两个对象如果调用equals函数是相等的话,那么调用hashCode函数一定会返回相同的整数。
3. 两个对象如果调用equals函数是不相等的话,那么调用hashCode函数不要求一定返回不同的整数。
我们在改写equals 和 hashCode 函数的时候,一定要遵守如上3条约定,在改写equals的同时也改写hashCode的实现,这样才能保证得到正确的结果。
相关文章推荐
- Java源码分析--Object
- Java NIO框架Netty教程(十) Object对象的连续收发解析分析
- Java Object 类源码分析
- 【小白的java成长系列】——顶级类Object源码分析
- java.lang.Object.clone()分析
- Java之类Object方法源码分析
- Java基础-----基类Object源码分析
- 面试题分析:7JAVA中Object的clone方法详解-克隆-深克隆
- java 中的 object.wait()和object.notify()的分析
- JAVA源码分析之---Object类(二)---hashCode,equals,clone方法的使用
- Java Object类讲解 上帝类及其一些方法的分析
- java.lang.Object.clone()分析
- Java源码分析之Object
- 方法object面试题分析:7JAVA中Object的clone方法详解-克隆-深克隆
- Java中Object的clone()及浅拷贝、深拷贝分析
- Java从JDK源码角度对Object进行实例分析
- JAVA源码分析之---Object类(一)---registerNatives,getClass方法的使用
- java.lang.Object.clone()分析
- java.lang.Object.clone()分析
- java源码分析01-Object源码分析