java hashtable排序_java中哈希表中有迭代器模式的实现,可以认为其是顺序表吗?...

先上答案:HashTable (哈希表)不是顺序表。

分析如下:

要搞清楚这个问题需要明确两个问题:

1. 什么是顺序表

2. 哈希表的数据结构

先说什么是顺序表。WIKI的解释是:顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。

简而言之,顺序表就是用数组作为底层存储的数据结构,和链表相对。在Java中ArrayList就是一个顺序表。而LinkedList就是一个链表。

顺序表的特点是:表长度等于底层数组的长度,插入新元素的位置为前一元素位置+1.

那么HashTable是以数组作为底层存储结构的嘛?这就涉及到第二个问题:哈希表的数据结构。

乍一看确实,HashTable最重要的成员变量就是一个叫table的数组。但是仔细看就会发现这个数组的每个元素是一个Entry 对象。那么什么是Entry?

注意Entry的next成员变量:这表明Entry是一个链表的节点,每个Entry都包含自己下一节点的引用。

如果我们再仔细阅读put(key, value) 方法就会发现,当往HashTable插入元素( pair)时HashTable会首先把新元素wrap成一个Entry object,然后根据Key的哈希值选择table数组的某一位置插入Entry 对象,如果那个位置已经有Entry对象了(即:哈希碰撞),则把新的Entry object添加到旧的Entry的后面成为链表中的新节点。

所以逻辑上,HashTable只是用数组最为哈希桶,而每个桶里存储的是一个链表。哈希表的长度显然不等于table数组的长度而是每个链表的长度的总和。哈希表插入元素也是非顺序的(不是按数组下标依次插入的,插入的元素也无法按照数组下标检索)。

话说回来,有没有实现迭代器Iterator并不能作为是不是顺序表的判断标准。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值