先上答案: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并不能作为是不是顺序表的判断标准。