哈希码


哈希码

文章插图
哈希码【哈希码】哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特徵儘量的有不同的哈希码,但不表示不同的对象哈希码完全不同 。也有相同的情况,看程式设计师如何写哈希码的算法 。
基本介绍中文名:哈希码
外文名:HashCode
类别:一种算法
方法套用:hibernate中
简介在Java中,哈希码代表对象的特徵 。例如对象 String str1 = “aa”, str1.hashCode= 3104String str2 = “bb”, str2.hashCode= 3106String 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对象,返回的哈希码也一样 。方法套用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个不同的对象 。这与我们假设的出了矛盾 。因此,我们将覆盖Object类中的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会先判断有没有叫“张三”的用户,如果没有,就允许插入,如果有,就不允许插入 。这样做可以保证数据的高度一致性,不同的项目有不同的需求,所以要根据自己的需求来覆盖equals方法 。两者关係equals和HashCode的关係在hibernate中,它认为2个对象只要equals返回true,那幺hashCode一定相等 。但是实际情况呢?User u1 = new User(“张三”);User u2 = new User(“张三”);由于我们重写了User的equals方法,所以 u1.equals(u2);返回true 但是,User并没有重写hashCode方法,它用的是Object类的hashCode方法,所以 u1.hashCode = 31050006 u2.hashCode = 31587890 两者的hashCode并不相等 。违背了hibernate的原则 由此hibernate会产生错误判断,又以为它们不是同一个对象,因此我们还得重写User 的hashCode方法 。如何重写hashCode方法呢?数字重写HashCode的重写哈希码要完成这幺一件事,首先要保证如果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根据我们自己的需求来判断重複对象