散列码的计算

        在实现词典这种数据结构时,我们需要根据查找键来查找所对应的值,这就要求我们首先要能计算出查找键的的散列码,然后再将散列码压缩为散列表的索引。

         查找键可以是一个类类型,也可以是字符串,也可以是基本类型。对于不同的类型有不同

的计算方法,下面做一下总结:

          一   类类型的散列码的计算

               JAVA的基类Object类中有一个方法hasCode( ),它返回一个整数散列码。所以JAVA中每个类都有此方法,但是一般我们需要重写此方法。因为此方法是根据对象的内存地址来返回一个散列码,这样内容相同的对象就返回了不同的散列码,因此要遵循覆盖次方法的一些则:   

                              1)如果某个类覆盖了equals(),那么它也应该覆盖hansCode()

                             2)如果equals() 返回相同的值,那么hasCode()也应该返回相同的值。

                             3)在同一个程序的两次执行中,对象的散列码可以不同。

            二  字符串的散列码的计算

                 对于字符串散列码的计算一般采用如下方法:将每个字符的Unicode值乘以一个该字符在字符串的位置的因子,散列码就是所有这些乘积的和。JAVA中的String的hasCode()就是用

一个常数31作为因子。

            三  基本类型的散列码的计算

                    对于基本类型的散列码的计算,一般都是采用转化为int型的。在JAVA中对于long型的数据,一般用是用移位操作将64位的值转换为32位的int值。对于double和float类型一般用其封装类的Double.doubleToLongBits(key)或者是Float.floatToLongBits(key),然后通过移位和异或

来完成:(int)bits^(bits>>>32)

         最后一个问题就是将散列码压缩为散列表的索引,对于这个问题通常的做法就是求模。但是一般为了元素能均匀的分配到散列表,一般散列表的元素的个数要是素数。

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值