黑马程序员技术交流社区

标题: 关于HashSet中哈希值输出的问题 [打印本页]

作者: 黄玉昆    时间: 2013-2-24 13:21
标题: 关于HashSet中哈希值输出的问题
  1. hs.add(new Person("a1",11));//哈希值是d9d---3485
  2.                 hs.add(new Person("a2",12));//哈希值是df5---3573
  3.                 hs.add(new Person("a3",13));//哈希值是ded---3565
复制代码
这个问题我说一下,开始我认为哈希表也是按照数组的索引方式一个一个取出的,也就造成了我误认为,每次读取哈希表中映射的地址值也是按顺序的。
简单来说,比如说,上面的三个地址值是按从大到小的顺序放在哈希表中的,但是取出的时候并不是按照索引的顺序取出的,而是按照哈希表中自己的算法(折半法、或者直接寻址法、或者平方取中法等等的散列函数的算法)进行查找的,所以,取出来的顺序并不是按照哈希表这个“数组”的顺序读取的。
我在百度中查了查关于哈希表的相关知识,如下:
哈希表也称为散列表,存放记录的数组叫做散列表。具体来说,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”, 作为这条记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。这是百度中的解释。
我的理解是:
我这里说一下不重写hashCode的方法的情况啊:
对于分配的地址值(如0xfc25)并不是直接存入哈希表的,而是先提取对象的信息摘要,通过散列函数的计算获得一个关键码,即哈希值,然后再将这个值存入一个有限的数组中,称之为散列表。而在读取的时候,会通过哈希表内部的散列函数进行查找的,这种函数的查找方式有很多种,比如直接寻址法、数字分析法、折叠法以及其他的一些方法等等,因此读取的顺序不一定是按照索引的顺序取出的。所以为什么会在打印的时候看到,并不是按哈希值的大小顺序打印的情况了。

不知道我这么说,是否容易理解,是否正确呢?还希望大家多多指教。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2