哈希码

哈希码哈希码 1 什么是哈希码 HashCode 在 Java 中 哈希码代表对象的特征 例如对象 Stringstr1 aa str1 hashCode 3104Stringst bb str2 hashCode 3106Stringst aa str3 hashCode 3104 根据 HashCode 由此可得出 str1 str2

哈希码

  1、什么是哈希码(HashCode) 在Java中,哈希码代表对象的特征。例如对象 String str1 = “aa”, str1.hashCode= 3104 String str2 = “bb”, str2.hashCode= 3106 String str3 = “aa”, str3.hashCode= 3104 根据HashCode由此可得出str1!=str2,str1==str3 哈希
码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。 下面给出几个常用的哈希码的算法。 1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。 2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。 3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。

  2、equals方法在hibernate中的应用。 equals方法是默认的判断2个对象是否相等的方法,在Object类里有实现,判断的是2个对象的内存地址。在hibernate中,不允许存在同类对象中有2个一样的实例。hibernate通过equals方法做判断。如: User u1 = new User(“张三”); User u2 = new User(“李四”); User u3 = new User(“张三”); 按照项目需求,用户只要名字相同,就表示同一个用户,所以我们认为,u1和u3是同一个人,同一个对象。但是因为u1,u2,u3三者的内存地址都各不相同,所以hibernate会认为这是3个不同的对象。这与我们假设的出了矛盾。 因此,我们将覆盖User的equals方法。 public class User{ private String userName; ….//get ,set方法省 //覆盖Object里的equals方法 public boolean equals(Object arg0){ if(!(arg0 instanceof User)){ return false; } User user = (User)arg0; //如果名字相同,则表示属于同一个对象。 if(user.getName().equals(this.getName)){ return true; }else{ return false; } } 这样hibernate在插入数据的时候,如果传过来一个叫”张三”的用户,hibernate会先判断有没有叫“张三”的用户,如果没有,就允许插入,如果有,就不允许插入。这样做可以保证数据的高度一致性,不同的项目有不同的需求,所以要根据自己的需求来覆盖equlas方法。

  3、为什么不按主键来判断因为主键是在插入数据进数据库之后才产生的,在一个对象还没有被持久化的时候,它是没有主键的,所以hibernate无法根据主键判断它是否有相同数据。 equlas和HashCode的关系。 在hibernate中,它认为2个对象只要equlas返回true,那么hashCode一定相等。 但是实际情况呢? User u1 = new User(“张三”); User u2 = new User(“张三”); 由于我们重写了User的equlas方法,所以 u1.equlas(u2);返回true 但是,User并没有重写hashCode方法,它用的是Object类的hashCode方法,所以 u1.hashCode = u2.hashCode = 两者的hashCode并不相等。违背了hibernate的原则 由此hibernate会产生错误判断,又以为它们不是同一个对象,因此我们还得重写User 的hashCode方法。如何重写hashCode方法呢? 4、HashCode的重写。 如第2节所讲,哈希码要完成这么一件事,首先要保证如果equlas出来的结果相等,那么hashCode也相等。像上面的u1和u2,由于名字都是“张三”,所以应该返回相同的hashCode。所以我们可以想一个办法。让User的哈希码返回User里面name字段的哈希码,这样就保证,名字相同的人,不但equlas方法相同,而且hashCode相等。 那么User类就变成 public class User{ private String userName; //覆盖Object里的equals方法 public boolean equals(Object arg0){ if(!(arg0 instanceof User)){ return false; } User user = (User)arg0; //如果名字相同,则表示属于同一个对象。 if(user.getName().equals(this.getName)){ return true; }else{ return false; } } //覆盖Object里的hashCode方法 public int hashCode(){ return name.hashCode();//返回名字的哈希码。 } } 这样可以保证hibernate根据我们自己的需求来判断重复对象。



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201744.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午8:43
下一篇 2026年3月20日 上午8:43


相关推荐

  • 5大开源 Manus 复刻项目全景解析

    5大开源 Manus 复刻项目全景解析

    2026年3月15日
    2
  • 【Python】Jupyter在PyCharm中的使用

    【Python】Jupyter在PyCharm中的使用最近在学CS231n的课程,打算把作业做一下。由于官方给的例程是用的IPython,后缀名为ipynb,和之前接触的Python写法不一样,来记录一下自己今天踩到的一个坑。其实有一个很简单的解决方法就是安装Anaconda,我也不知道自己为什么要在PyCharm上死磕。步骤0安装Jupyterpipinstalljupyter1新建一个IPython文件这里

    2025年8月4日
    6
  • 尾插法建立链表详解

    尾插法建立链表详解尾插法 顾名思义 就是把新加入的节点插入到上一个节点的尾部 头插法是把新加入的节点插入到上一个节点的头部 next 存储下一个节点位置的地址 开始时 初始化定义头节点 head gt next NULL 表示头节点的下一个节点为空 就是该链表只有一个头节点 图形化表示为由于头插法要把每一个新加入的节点插入到上一个节点的尾部 所以需要定义一个指针 记录每次插入变换后的最后一个节点的指针域信息 r head 将头节点赋值给 r r 记录每次插入变换后尾部的信息申请一个节点

    2026年3月17日
    2
  • java数组初始化0_Java自学-数组 初始化数组

    java数组初始化0_Java自学-数组 初始化数组Java 如何初始化数组步骤 1 分配空间与赋值分步进行 publicclassH publicstatic String args int a newint 5 分配了长度是 5 的数组 但是没有赋值 没有赋值 那么就会使用默认值 作为 int 类型的数组 默认值是 0System out println a 0 进行赋

    2026年3月26日
    1
  • 讯飞语音听写(流式版)开发指南

    讯飞语音听写(流式版)开发指南

    2026年3月14日
    1
  • 2021前端面试题及答案_前端开发面试题2021

    2021前端面试题及答案_前端开发面试题2021废话不多说直接上干货1.js运行机制JavaScript单线程,任务需要排队执行 同步任务进入主线程排队,异步任务进入事件队列排队等待被推入主线程执行 定时器的延迟时间为0并不是立刻执行,只是代表相比于其他定时器更早的被执行 以宏任务和微任务进一步理解js执行机制 整段代码作为宏任务开始执行,执行过程中宏任务和微任务进入相应的队列中 整段代码执行结束,看微任务队列中是否有任务等待执行,如果有则执行所有的微任务,直到微任务队列中的任务执行完毕,如果没有则继续执行新的宏任务 执行新的宏…

    2022年8月27日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号