黑马程序员技术交流社区
标题: 关于hashCode方法和哈希值的理解? [打印本页]
作者: 郑彬 时间: 2012-8-15 23:33
标题: 关于hashCode方法和哈希值的理解?
关于hashCode方法和哈希值的理解?比如为什么就是在hashset集合中,如果两个对象equal相等,哈希值不一定相等,所以也是不相等。
当然这个只是一点,希望有详细的理解hashCode方法和哈希值。
作者: 左建飞 时间: 2012-8-15 23:42
在一个集合中,如果要查找某个对象,大概的代码会怎么写呢?通常是逐一取出每个元素与要查找的元素进行比较,当发现某个元素与要查找的对象进行equals方法进行比较的结果相等时,则停止继续查找并返回肯定的信息,否则返回否定的信息。但如果一个集合中有很多元素,则意味着你的程序可能要从很多个元素逐一取出才能得出结论。
于是便有了哈希算法,用这种算法将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储在哪个区域。
HashSet就是采用哈希算法存取对象的集合,当从HashSet中查找某个对象时,java系统首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希码找到相应的存储区域,最后取出该存储区域内的每个元素与该对象进行equals方法比较,这样不用遍历集合中的所有元素就可以得到结论。
为了保证一个类的实例对象能在HashSet正常存储,要求这个类的两个实例对象用equals()方法比较的结果相等时,它们的哈希码也必须相等。如果一个类的hashCode()方法没有遵循上述要求,那么,当这个类的两个实例对象用equals()方法比较的结果相等时,他们本来应该无法被同时存储进Map集合中,但是,如果由于它们的hashCode()的返回值不同,第二个对象首先按哈希码计算可能会被放进与第一个对象不同的区域中,这样,它就不可能与第一个对象进行equals方法比较了,也就可能被存储进HashSet中了。Object类中的hashCode()方法不能满足要求,因为它的返回值是通过对象的内存地址推算出来的,同一个对象在程序运行期间哈希值都是始终不变的。所以,只要是两个对象,即使它们的equals方法比较结果相等,它们默认的hashCode方法的返回值是不同的。所以必须重写hashCode()方法。并且我们重写的返回值要尽量每个对象都不同,这样就不用再调用equals了,更加效率。
楼主可以去看看张老师的高新技术视频,里面有一节是透彻讲解hash的。
作者: 郑彬 时间: 2012-8-18 10:11
问题已经解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |