== 与equals 的区别
==
使用==的时候会根据对象的类型为引用对象还是值对象分开处理,如果是值对象的话会直接比较2个值是否相等,如果是引用对象的话会比较内存地址是否相同
equals
equals 是Object 类提供的方法,除了值对象之外的其他对象都可以通过调用equals比较,如果没有重写此方法那么实质上也是比较2个对象的内容。
为什么需要重写equals
当我们的对象之间是否相等需要根据对象的内容判断而不是通过对象存储的地址判断的时候我们就需要重写equals。
比如有一个用户类(User),里面有用户编号的属性,不管这个对象是根据什么情况创建出来的,只要他们的编号相同,我们就认为他们是相等的,这个时候就要重写equals。
为什么要重写hashCode
- 前面提到了为什么要重写equals,请看下图,在Object类的equals中有这样一段描述
这段内容上描述的是当我们重写equals方法的时候,我们同样需要重写hashCode方法,因为在object类上约定**‘相等’**的2个对象hashCode方法需要返回相同的值 - 重写hashCode 会影响到HashMap,HashSet等一系列的使用
补充
- hashCode 相等的时候对象不一定相等,但是2个对象如果使用equals判断相等,那么他们的hashCode 一定相等。如果2个对象equals不相等但是hashCode相等 这个现象就是hash冲突,原因是hashCode是程序通过一系列算法计算出来的,所以存在重复的可能性。
- 在hashCoe不可靠的情况下为什么还要使用它,因为hashCode比较的效率比equals要高,如果hashCode不一样那么equlas就没有必要调用了,可以提高性能