如果一个实体对象需要根据对象中的某几个属性来判断唯一性,即需要重写equals方法
如下
关于equals和hashcode的重写细节

如果重写了equals,那就必须重写hashcode

  1. 比如list中添加元素的时候,首先是判断hashcode的,如果没有hashcode,那就插入,冲突的话再进行equals的比较,不然太慢了
  2. 如果不重写的话,会出现两个对象equals一致但是hashcode不一致的不合常理的现场

重新给hashcode如下:
关于equals和hashcode的重写细节

至于为什么要乘31,看一下String的hashCode实现方法
关于equals和hashcode的重写细节

  1. 因为31是个神奇的数字,任何数n*31都可以被jvm优化为(n<<5)-n,移位和减法的操作效率比乘法的操作效率高很多
    更少的乘积结果冲突
  2. 31是质子数中一个“不大不小”的存在,如果你使用的是一个如2的较小质数,那么得出的乘积会在一个很小的范围,很容易造成哈希值的冲突。而如果选择一个100以上的质数,得出的哈希值会超出int的最大范围,这两种都不合适

相关文章: