我决定修改java集合框架,所以从内部实现开始。一个问题浮现在我的脑海里,我无法解决。希望有人能对下面的内容做出明确的解释。
arraylist使用线性或二进制搜索(两者都有优点/缺点),但我们可以用它们做任何事情!我的问题是为什么所有的“哈希”类(比如hashmap f.e.)都使用哈希原理?他们不能解决线性或二进制搜索的例子?为什么不在数组中存储键/值对呢?相反,为什么没有(例如,arraylist存储在hashtable中)?
我决定修改java集合框架,所以从内部实现开始。一个问题浮现在我的脑海里,我无法解决。希望有人能对下面的内容做出明确的解释。
arraylist使用线性或二进制搜索(两者都有优点/缺点),但我们可以用它们做任何事情!我的问题是为什么所有的“哈希”类(比如hashmap f.e.)都使用哈希原理?他们不能解决线性或二进制搜索的例子?为什么不在数组中存储键/值对呢?相反,为什么没有(例如,arraylist存储在hashtable中)?
2条答案
按热度按时间ghhkc1vu1#
集合框架的意图是程序员将选择适合用例的数据结构。根据您使用它的目的,不同的数据结构是合适的。
散列类使用散列原理,正如您所说的,因为如果您选择它们,那么这就是您想要使用的(散列通常是简单、直接查找的最佳选择。)螺丝刀使用拧入原理,因为如果你拿起螺丝刀,你想拧入一些东西;如果你有钉子要钉进去,你就会拿起锤子。
但如果您不打算执行查找,或者如果线性搜索对您来说足够好,那么
ArrayList
是你想要的。将哈希表添加到一个永远不会使用它的集合中是不值得的,而且做一些不需要的事情需要花费cpu和内存。gcuhipw92#
我有一个很大的散列值(大约1500个)。代码的本质是,一旦hashmap被加载,它就永远不会被修改。hashmap在每个网页上都被访问了很多次,我想知道是否可以加快它的速度,以便更快地加载页面。
有一天我有一些时间,所以我做了一系列的时间测试(使用纳米时间函数)。然后,我将hashmap的用法重写为一个数组。不是arraylist,而是实际的数组[]。我将索引与用于获取哈希值的键类一起存储。
不同的是,数组查找速度更快。我算了一下,如果花上一天的时间,我几乎可以省下整整一秒钟!
是的,使用数组比使用散列更快,ymmv:-)
我把我的代码恢复为使用hashmap,因为它更容易维护。。。