如果一个实体对象需要根据对象中的某几个属性来判断唯一性,即需要重写equals方法
如下
如果重写了equals,那就必须重写hashcode
- 比如list中添加元素的时候,首先是判断hashcode的,如果没有hashcode,那就插入,冲突的话再进行equals的比较,不然太慢了
- 如果不重写的话,会出现两个对象equals一致但是hashcode不一致的不合常理的现场
重新给hashcode如下:
至于为什么要乘31,看一下String的hashCode实现方法
- 因为31是个神奇的数字,任何数n*31都可以被jvm优化为(n<<5)-n,移位和减法的操作效率比乘法的操作效率高很多
更少的乘积结果冲突 - 31是质子数中一个“不大不小”的存在,如果你使用的是一个如2的较小质数,那么得出的乘积会在一个很小的范围,很容易造成哈希值的冲突。而如果选择一个100以上的质数,得出的哈希值会超出int的最大范围,这两种都不合适