一、==与equals的区别
1.==
==对于基本数据类型来说,比较的是值。对于引用数据类型来说,比较的是对象内存地址。
2.equals()方法
如果一个类没有重写equals方法,那么比较两个对象时,默认比较的是对象的内存地址,即等价于通过==来比较。
如果一个类重写了equals方法,那么就有自定义的来比较是否相等的标准。
二、hashCode与equals之间的关系
1.hashCode()方法
hashCode方法的作用是获取哈希码,也称为散列码。定义在Object类中,默认是将对象的内存地址转换为整数之后返回。
哈希码主要在哈希表这类集合映射的时候用到。(例如HashMap将Key映射到对应的Value上,用的就是哈希取余法,拿哈希码与存储元素数组的长度取余,获取Key对应的Value所在下标位置。)
2.为什么重写equals方法时必须重写hashCode方法?
上面说到,equals方法默认比较的是对象内存地址,重写后,才有自定义的比较规则。而在hashMap的源码中,是先通过hashCode方法获取对象的哈希值,比较两个对象的hash值是否相等,再通过equals方法来进行比较。所以在equals方法未被重写时,通过hashCode方法获取哈希值来比较和通过equals方法来比较,本质上比较的都是对象的内存地址。一旦重写了equals方法,即不再用对象内存地址比较,有自定义的比较规则,那么为了保持这两个方法比较对象是否相等结果的一致性,所以也必须重写hashCode方法,让它不再通过对象的内存地址来获取哈希值,而是自定义其获取哈希值的方式,来实现两个对象使用equals方法比较为true 那么通过hashCode方法获取它们的hash值也必须相等。