在我最近的一次软件工程师职位面试中,我被问到这样的问题:hashtable和hashmap之间有什么区别?我问面试官他是否具体是Java,因为在Java哈希表中是同步的,而hashmap不是(实际上谷歌搜索后的哈希表与哈希地图的比较大量信息,所以这不是我要找的答案)但是他说没有和我想让我解释一下这两者的区别。
对于这个问题,我真的感到困惑和震惊(现在仍然感到困惑)。 IMO,hastable或hashmap只是一个术语问题。实际上只有Java既有术语又有其他语言如C ++,它们甚至没有术语哈希表。在采访中,我刚刚解释了哈希的原理,并说哈希图和哈希表都应该基于这个原则来实现,我不知道这两者之间是否有任何区别。面试官肯定不相信,正在寻找其他答案,当然我在那一轮后被拒绝了。
回到主题,如果有的话,一般来说hashmap和hashtable之间可能存在什么区别(不是特定于Java)?
答案 0 :(得分:5)
在计算机科学中,由于措辞的原因存在差异。
HashTable是某种使用键哈希查找表中相应值的查找表,如数据结构。这只是一种键值映射。您可能已经意识到有不同的实现。不同的哈希,哈希共谋解决方案和表增长策略以及更多内幕。如果你出于某种原因需要制作自己的哈希表,那就很有趣了。
HashMap是键值对与散列键的某种映射。映射是抽象的,它可能不是表。也可以使用平衡树或尝试或其他数据结构/映射。
您可以简化并说HashTable是底层数据结构,而HashMap可能正在使用HashTable。
字典是另一个抽象级别,因为它可能根本不使用哈希 - 例如使用全文二进制搜索查找或其他比较方式。这是你可以在不考虑某些编程语言的情况下获得的所有内容。
- 在思考太多之前。你能肯定地说 - 你的面试官对他/她在谈论什么有线索吗?您是否讨论过技术细节,或者他们只是倾听/询问并有时评论?有时,面试官只是想出他们一开始并不真正理解的问题的最嘲笑答案。 就像你自己写的那样,一般来说它只是术语。软件开发人员经常使用这些术语可互换,除非那些真正有差异的人可能会像Java一样。
答案 1 :(得分:1)
面试官可能一直在寻找......的洞察力。
std::pair<>
。示例:一个(坏)哈希表实现阻止用作哈希映射。
考虑:
template <typename T>
class Hash_Table
{
...
bool insert(const T& t)
{
// work out which bucket t hashes to...
size_t bucket = hash_bytes((void*)&t, sizeof t) % num_buckets_;
// see if t is already stored in the bucket...
if (memcmp((void*)&t, (void*)&buckets_[bucket], sizeof t) == 0)
...
... handle collisions etc. ...
}
...
};
上面,对哈希函数的硬编码调用将处理为二进制blob的值和整个memcmp
的{{1}},意味着你不能t
1}}说一个T
并使用哈希表作为从std::pair<int, std::string>
到int
s的哈希映射。因此,它是哈希表的一个示例, 可用作哈希映射。
您 可能会或可能不会 也会考虑一个哈希表,它根本不提供任何便利功能,可用作哈希映射而不是哈希映射。例如,如果API设计为,就像只处理值 - string
- 但它允许调用者指定任意自定义比较和散列函数,这些函数可能会将其操作仅限于键h.insert(t); h.erase(t); auto i = h.find(t);
的一部分,然后哈希表可以(ab)用作函数哈希映射。
为了澄清这与makadev现有答案的关系,我不同意:
&#34; HashTable [使用]键哈希查找相应的值&#34; ;错误,因为它假设了一个键 - >值映射。
&#34; HashMap [...]。映射是抽象的,它可能不是表。也可以使用平衡树或尝试或其他数据结构/映射。&#34 ;;错误,因为哈希映射的主要机制仍然是表/数组中的桶(索引)的键的散列:一些哈希表/映射可能使用其他数据结构(数组,链表,树...)来存储在同一个桶中发生冲突的元素,但这是一个不同的问题,而不是哈希表和哈希映射之间的区别。
答案 2 :(得分:-1)
实际上HashTable已经过时,HasHMap是最好的使用方法,因为Hashtable是同步的。如果不需要线程安全实现,建议使用HashMap代替Hashtable。如果需要线程安全的高度并发实现,那么建议使用java.util.concurrent.ConcurrentHashMap代替Hashtable。
第二个区别是HashMap扩展了Map Interface以及是否为HashSet Dictionary接口。