重写equals和hashCode方法

    科技2022-08-06  107

    重写equals()

    @Override public boolean equals(Object o){ if(this == o) return true; if(o == null || getClass() != o.getClass()) return false; User user = (User) o; retrun Objects.equals(name, user.name) && age == user.age; }

    为什么不能使用instanceof呢?

    因为当一个类与它的子类进行比较时,用instanceof方法返回的也是true

    为什么不全部使用==进行比较呢?

    比较时,要求基本类型相等,引用类型需要使用java.util.Objects类的equals静态方法进行对比

    重写hashCode()

    @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; }

    在equals方法没被修改的前提下,多次调用同一对象的hashcode方法返回的值必须是相同的整数

    如果两个对象互相equals,那么这两个对象的hashcode值必须相等

    为不同对象生成不同的hashcode可以提升哈希表的性能

    为什么使用31作为基数呢?

    基数要用是质数,每个对象根据值计算HashCode,这个code大小虽然不奢求必须唯一,但是要尽可能的不要重复,因此基数要尽量的大,并且31只占用5bits。所以从效率上,31是2的5次减1,对计算机来说2的乘除操作只需要做位移操作(1<<5 - 1)。 也就是说31对计算机的角度来说运算更快、切占内存不多不少,而且形成惯例,虚拟机甚至都专门对他做了优化。
    Processed: 0.009, SQL: 8