A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄玉昆 黑马帝   /  2013-2-24 13:21  /  1163 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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)并不是直接存入哈希表的,而是先提取对象的信息摘要,通过散列函数的计算获得一个关键码,即哈希值,然后再将这个值存入一个有限的数组中,称之为散列表。而在读取的时候,会通过哈希表内部的散列函数进行查找的,这种函数的查找方式有很多种,比如直接寻址法、数字分析法、折叠法以及其他的一些方法等等,因此读取的顺序不一定是按照索引的顺序取出的。所以为什么会在打印的时候看到,并不是按哈希值的大小顺序打印的情况了。

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

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马