问题
equals和hashcode的作用是什么
答案
equals 方法在非空对象引用上实现相等关系判断,它具有自反、对称、传递、一致性,这其实也是数学上相等的定义。
#摘自JDK帮助文档
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
hashCode返回该对象的哈希码值,它具有以下特性:
#摘自JDK帮助文档
在 Java 应用程序执行期间,在对同一对象多次调用hashCode方法时,必须一致地返回相同的整数,前提是将对象进行 equals比较时所用的信息没有被修改。
如果根据 equals方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode方法都必须生成相同的整数结果。
如果根据equals方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不要求一定生成不同的整数结果,但为不相等的对象生成不同整数结果可以提高哈希表的性能。
综上,Object类中的equals方法和"=="是一样的,即俩个对象的比较是它们的栈内存中存储的内存地址;但是对于String类,Integer类等一些类,是重写了equals和hashCode方法,才使得equals和"=="不同,他们比较的是值是不是相等。所以,当自己创建类时,要想实现基于不同的等于比较,必须重写equals和hashCode方法。
网友评论