首页 > 编程语言 >在Java中重写hashCode()方法

在Java中重写hashCode()方法

时间:2024-02-01 15:22:44浏览次数:39  
标签:Java name idCard hashCode result 重写 public String

而在重写equals()方法时,总要重写hashCode()方法,原因总结下有以下两点:
1.使用hashcode方法提前校验,可以避免每一次比对都调用equals方法,提高效率
2.保证是同一个对象,如果重写了equals方法,而没有重写hashcode方法,会出现equals相等的对象,hashcode不相等的情况,重写hashcode方法就是为了避免这种情况的出现。

如何重写hashCode()方法

package Test;

public class Person3 {
    private String name;
    private String idCard;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getIdCard() {
        return idCard;
    }
    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    public Person3() {}

    public Person3(String name, String idCard) {
        this.name = name;
        this.idCard = idCard;
    }

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

    public static void main(String[] args) {
        Person3 p1 = new Person3("赵四", "41081234");
        Person3 p2 = new Person3("赵四", "41081234");
        System.out.println("p1的hashCode是" + p1.hashCode());
        System.out.println("p2的hashCode是" + p2.hashCode());
    }
}

这段代码的运行结果为:

p1的hashCode是1301683616
p2的hashCode是1301683616

在我们重写hashCode()方法后,可以看到两个属性值完全相同的对象,他们的哈希值是相同的。从业务的角度来说,达到了这两个对象相同的目的。
为什么重写时要使用31?

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

    首先为了尽量让产生hashcode保持唯一,所以一定使用一个素数来做系数(这里的31)
    但为什么是31而不是别的素数呢?
    因为31属于一个特殊的质数
    任何数 乘以 31 就等于 这个数 * 2 的5次方 - 这个数本身
    <<左移几位 表示 乘以 2 的几次方
    >>右移几位 标识 除以 2 的几次方
    n * 31 等价于 (n * 2 * 2* 2 * 2 * 2 - n) (n << 5) - n

                        



                        
参考链接:https://blog.csdn.net/weixin_44015626/article/details/107120469

标签:Java,name,idCard,hashCode,result,重写,public,String
From: https://www.cnblogs.com/JavaYuYin/p/18001350

相关文章

  • 深入浅出Java多线程(五):线程间通信
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第五篇内容:线程间通信。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在现代编程实践中,多线程技术是提高程序并发性能、优化系统资源利用率的关键手段。Java作为主流的多线程支持语言,不仅提供了丰富的......
  • 基于Java+Neo4j开发的知识图谱+全文检索的知识库管理系统(源码分析)
    在数字化高度普及的时代,企事业机关单位在日常工作中会产生大量的文档,例如医院制度汇编,企业知识共享库等。针对这些文档性的东西,手工纸质化去管理是非常消耗工作量的,并且纸质化查阅难,易损耗,所以电子化管理显得尤为重要。【springboot+elasticsearch+neo4j+vue+activiti】实现数字......
  • java8计算日期
    java8使用时间计算publicstaticvoidmain(String[]args){LocalDatelocalDate=LocalDate.now();//1.获取周日LocalDatewith=localDate.with(DayOfWeek.SUNDAY);System.out.println(with);//2.获取本月最后一天......
  • Linux系统之安装java开发环境
    Linux系统之安装java开发环境 检查本地系统环境1.检查系统版本检查本地系统版本,本次实践使用的是centos7.6版本。[root@jeven~]#cat/etc/centos-releaseCentOSLinuxrelease7.6.1810(Core)2.检查系统内核版本检查系统内核版本[root@jeven~]#uname-r6.1.8-1.el......
  • Java并发基础:Phaser全面解析!
    内容概要Phaser是Java中一个灵活的同步工具,其优点在于支持多阶段的任务拆分与同步,并且能够动态地注册与注销参与者,它提供了丰富的等待与推进机制,使得开发者能够更细粒度地控制线程的协调行为,实现复杂的并行任务处理,相比于其他同步工具,Phaser更加灵活且易于扩展,适用于多种并发场景......
  • 韩顺平Java自学编程误区,评论区的总结
    韩顺平Java自学编程误区,评论区的总结———韩顺平听了两遍,觉得很有收获。总结韩老师的视频内容。总结了10条。需要的大家可以参考。总结(我只总结10个)韩老师自学编程的13个误区:1.不注重基础(例如:oop,网络、操作系统、基本数据结构、算法、常用的设计模式、多线程、高并发基础知识......
  • Java 中的集合
    集合纲要Collection和IteratorListSetMapCollections工具类Comparable与Comparator数组其实也是一个集合。集合实际上就是一个容器,可以容纳其他类型的数据集合是一个容器一个载体,可以一次容纳多个对象在实际开发中,假设连接数据库,数据库中有10条记录,那么假设把......
  • 方法重载和方法重写的区别
    方法重载和方法重写的区别1.什么是方法重载?方法重载(MethodOverloading)是指在同一个类中,可以定义多个方法具有相同的名称,但是参数列表不同。重载的方法可以有不同的参数类型、不同的参数个数,或者参数类型的顺序不同。方法重载的目的是提高代码的灵活性和可读性。方法重载的规则......
  • JAVA应用CPU跳点自动DUMP工具 | 京东物流技术团队
    背景在做系统监控时,CPU的使用率是一个关键的指标,它反映了系统的性能稳定性以及是否存在异常情况,能帮助我们了解系统的负载情况。通过监控CPU使用率,可以判断系统是否正常运行或者是否存在性能问题。如果CPU使用率过高,可能表示系统存在资源瓶颈,需要进行优化或升级。CPU监控的难点现有......
  • JAVA应用CPU跳点自动DUMP工具 | 京东物流技术团队
    背景在做系统监控时,CPU的使用率是一个关键的指标,它反映了系统的性能稳定性以及是否存在异常情况,能帮助我们了解系统的负载情况。通过监控CPU使用率,可以判断系统是否正常运行或者是否存在性能问题。如果CPU使用率过高,可能表示系统存在资源瓶颈,需要进行优化或升级。CPU监控的难......