您的位置:首页 > 编程语言 > Java开发

学习Thinking in Java 中的散列与散列码知识总结

2014-05-22 23:17 274 查看
       对于散列的概念,维基百科是这样定义的:散列(Hashing)是电脑科学中一种对资料的处理方法,通过某种特定的函数/算法(称为散列函数/算法)将要检索的项与用来检索的索引(称为散列,或者散列值)关联起来,生成一种便于搜索的数据结构(称为散列表)。也译为散列。

       对于散列码,是通过一个变量计算出来的,在Java语言里,是使用Objectde的hashCode()方法生成的,默认是使用对象的地址计算散列码。要想编写出恰当的hashCode()方法,如果仅编写hashCode()方法是不够的,还必须同时覆盖equals()方法。由于Object.equals()默认是通过对象的地址进行比较,因此需要DIY覆盖equals()方法,正确的equals()方法,必须满足下列5个条件:1)自反性  2)对称性  3)传递性 4)一致i性 5)对任何不是null的x,x.equals(null)
一定返回null.

       对于hashCode() 方法,并不需要总是能够返回唯一的标识码,但是equals()方法必须严格判断两个对象是否相同。

       前边的解释目的是为了说明如果部位你的键覆盖hashCode()和equals()方法,那么使用散列的数据结构(HashSet,HashMap,LinkedHashSet,LinkedHashMap)就无法正确处理你的键。然而,要很好地解决此问题,必须了解这些数据结构的内部构造。

       首先,使用散列的目的在于:想要使用一个对象来查找另一个对象。散列的价值在于速度。由于瓶颈位于键的查询速度,因此解决方法之一就是保持键的排序状态,然后使用Collections.binarySearch()进行查询。散列则更近一步,它将键保存在某处,以便能够很快找到。由于存储一组元素最快的数据结构是数组,所以使用它来表示键的信息(不是键本身)。数组不保存键本身,而是通过键对象生成一个数字,将其作为数组下标。这个数字就是散列码,由定义在Object中的,且可能由你的类覆盖的hashCode()方法生成。由于容量固定,不同的键会产生相同的下标,可能会产生冲突,因此,冲突由外部处理,数组并不直接保存值,而是保存值的list,然后对list中的值用equals处理。由一系列步骤看出,查询的时间复杂度是O(1)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: