为什么要重写equals和hashCode方法
1.需要将对象放入HsahMap、HashSet等集合中的类需要重写HashCode和equals()方法:
Hashcode在基于key-value的集合如:HashMap、LinkedHashMap中扮演很重要的角色。此外在HashSet集合中也会运用到,使用合适的hashcode方法在检索操作时的时间复杂度最好的是 O(1).
hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。
hashCode()方法被用来获取给定对象的唯一整数。这个整数被用来确定对象被存储在HashTable类似的结构中的位置。默认的,Object类的hashCode()方法返回这个对象存储的内存地址的编号。
参考Josh Bloch的书《Effective Java》,一个好的hashcode方法通常最好是不相等的对象产生不相等的hash值,理想情况下,hashcode方法应该把集合中不相等的实例均匀分布到所有可能的hash值上面。
补充一个类似的:什么时候类需要实现Serializable接口:当某个类的实体对象需要持久化到硬盘,或通过网络传输数据
2. 对于对象中的每个域,hashCode值遵循以下原则
为该域计算int类型的哈希值hc:
- 如果是boolean类型,计算(f?1:0)
- 如果是byte、char、short或者int类型,计算(int)f
- 如果是long类型,计算(int)(f^(f>>>32))
- 如果是float类型,计算Float.floatToIntBits(f)
- 如果是double类型,计算Double.doubleToLongBits(f),然后重复第三个步骤。
- 如果是一个对象引用,并且该类的equals方法通过递归调用equals方法来比较这个域&#