Java “散列”比“线性”搜索更有效吗?

Java “散列”比“线性”搜索更有效吗?,java,hash,collections,Java,Hash,Collections,我决定修改Java集合框架,所以从内部实现开始。有一个问题出现在我脑海里,我无法解决。希望有人能对下面的内容做出明确的解释 ArrayList使用线性或二进制搜索两者都有优点/缺点,但我们可以用它们做任何事情!我的问题是,为什么像HashMap f.e.这样的所有“哈希”类都使用哈希原理?例如,他们不能解决线性或二进制搜索吗?为什么不在数组中存储键/值对呢?相反,例如ArrayList为什么不存储在哈希表中?集合框架的目的是程序员选择适合用例的数据结构。根据您使用它的目的,不同的数据结构是合适的

我决定修改Java集合框架,所以从内部实现开始。有一个问题出现在我脑海里,我无法解决。希望有人能对下面的内容做出明确的解释


ArrayList使用线性或二进制搜索两者都有优点/缺点,但我们可以用它们做任何事情!我的问题是,为什么像HashMap f.e.这样的所有“哈希”类都使用哈希原理?例如,他们不能解决线性或二进制搜索吗?为什么不在数组中存储键/值对呢?相反,例如ArrayList为什么不存储在哈希表中?

集合框架的目的是程序员选择适合用例的数据结构。根据您使用它的目的,不同的数据结构是合适的

正如您所说,散列类使用散列原理,因为如果您选择它们,那么这就是您想要使用的。对于简单、直接的查找,哈希通常是最佳选择。螺丝刀使用螺丝原理,因为如果你拿起螺丝刀,你想拧入一些东西;如果你有一颗钉子需要钉进去,你就会拿起锤子


但如果您不打算执行查找,或者线性搜索对您来说已经足够好了,那么您需要的就是ArrayList。将哈希表添加到一个永远不会使用它的集合中是不值得的,而且做一些你不需要的事情需要CPU和内存。

我有一个大约1500个值的大哈希表。代码的本质是,一旦加载hashmap,它就永远不会被更改。hashmap在每个网页上都被访问了很多次,我想知道它是否可以加快页面加载速度

有一天我有时间,所以我用nano时间函数做了一系列的时间测试。然后,我将hashmap的使用改为一个数组。不是ArrayList,而是实际的数组[]。我使用用于获取散列值的键类存储索引

不同的是,数组查找速度更快。我算了算,在一天的活动中,我会节省几乎整整一秒钟

是的,使用数组比使用散列更快,YMMV:-


我将代码恢复为使用hashmap,因为它更易于维护…

谢谢朋友,我同意,但它实际上没有回答我的问题。我仍然不明白散列如何比线性或二进制更有效。为什么再加一个呢?他们不能用这两个来修复K,V对吗?它更有效,因为它需要O1而不是olg n或On;它必须比较恒定数量的键才能平均找到目标。它的速度要快得多,但要消耗适度的内存开销。例如,在链表中搜索需要线性时间,因为您必须在整个列表中搜索您的值。在哈希表中搜索需要固定的时间O1,因为您直接从值本身“哈希函数”获取值的索引。他们不使用它,因为不是每个人都想在不需要时支付内存使用成本。ArrayList.get5可以立即跳转到该索引。不幸的是,这两个注释都是错误的。获取哈希表中的第五个bucket所需的时间与获取数组中的第五个元素所需的时间完全相同。但是查找与字符串apple关联的散列桶要比为apple检查数组的每个元素快。