== 与 equals 区别
==
: 基本数据类型比较的是值
,引用数据类型比较的是内存地址
equals()
: 它的作用也是判断两个对象是否相等。- 但它一般有两种使用情况:
- 情况1:类没有覆盖(重写) equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
- 情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
hashCode 与 equals() 区别
面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写 equals 时必须重写 hashCode 方法?”
一,hashcode() 的性质:
对象的散列码. 他只能保证离散, 不能保证唯一.
也就是说:
- 如果两个对象相等,他们的 hashcode() 一定相等.
- 但是 hashcode() 相等, 这两个对象不一定相等;
hashcode() 方法存在的意义是: 提高两个对象 比较的效率;
当两个对象进行比较的时候: 先比较 hashcode(), 如果hashcode() 不相等, 说明这两个对象一定不相等,
如果hashcode() 相等 才会 使用 equals() 方法 比较对象的的 值.
- 也就是说: 只有当 hashcode() 相等的时候, 才能调用 equals();
如果只重写 equals() 不重写 hashcode()
Object类的 hashcode()方法 无法保证 两个相等对象的 hashcode() 相等, 这样也就无法equals();
如果只重写 hashcode() , 不重写equals()
因为 hashcode() 无法保证唯一性, 所以两个不相等的对象,他们的hashcode() 是有可能相等的.
如果不重写equals(), 无法比较他们是不是真的相等.
结论:
所以建议两个方法同时重写.
hashcode()
是为了提高比较效率的, 因为equals() 方法还是比较耗费效率的.
equals()
是为了在 hashcode() 无法区分两个对象是否相等的时候, 用来比较他们时候真的相等的手段.