默认情况下也就是从超类Object继承而来的equals方法与‘==’是完全等价的,比较的都是对象的内存地址,但我们可以重写equals方法,使其按照我们的需求的方式进行比较,如String类重写了equals方法,使其比较的是字符的序列,而不再是内存地址。
java集合中,判断两个对象是否相等的规则是:
判断两个对象的hashCode是否相等:
- 如果不相等,认为两个对象也不相等;
- 如果相等:判断两个对象用equals运算是否相等
- 如果不相等,认为两个对象也不相等
- 如果相等,认为两个对象相等
即:
- 如果两个对象相同(eqauls比较),那么它们的hashCode值一定要相同;key1=key2 则hash(key1)=hash(key2)
- 如果两个对象的hashCode相同,它们并不一定相同 ;hash(张三)=hash(李四) 但是(hash碰撞) :张三 !=李四
为什么要重载equal()
答案:因为Object的equal方法默认是两个对象的引用
的比较,意思就是指向同一内存地址
则相等,否则不相等;所有的对象都拥有标识(内存地址)和状态(数据);现需要利用对象里面的值来判断
是否相等,则重载equal方法。
原文链接,很详细: