假设我有一个好钥匙,那么在Java中使用地图时不合适



可能的重复:
何时在linkedlist或arraylist上使用hashmap,vice-vices-vice-vice-vice-vice-vice-vice-vice-vice-vice-vice-vice-vice-vice-vice-vice-vice-vice-vice-vice-

自从Java中遇到Maps以来,我一直在广泛使用它们。特别是HashMap是许多情况的绝佳选择。看来它在每个类别中都胜过ArrayList - 有人说迭代是不可预测的,但我们有LinkedHashMap

那么,我的问题是:如果我们有一个坚实的不变钥匙,为什么不始终使用HashMap

此外,使用 HashMap之类的物品(< 10)的项目是否合适,或者我不考虑其他一些开销?

当键是顺序整数时,请使用ArrayList。(如果它们不在0,只需使用偏移即可。)访问(尤其是随机访问)和更新的效率要高得多。否则,当然,HashMap(或您说的是LinkedHashMap)是非常有用的数据结构。

我相信HashMap的默认初始大小为16桶,因此很小的列表有一些开销。但是,除非您正在创建地图的 lot ,否则它不应该是您编码的因素。

哈希玛普与数组(或arrayList)相比具有大量的开销:

  • 您需要哈希键以将索引输入衬板数组中,然后存储值和键。这比数组较慢,并且使用更多的内存。当您的钥匙很大或复杂时,这一点更为重要,因为它需要更长的时间或占用更多空间。
  • 您还需要每次查找值时都需要哈哈密钥。
  • 调整大小数组列表时,您只需创建一个新数组即可复制所有内容。调整hashmap大小时,您会创建一个新数组,然后重新计算哈希(因此它们将通过新数组分散)。
  • Hashmap的填充时的表现不佳,因此它们通常会留下大约25%的空间。

这些都是很小的,因此您可以一直使用哈希图(实际上,这是PHP的作用),但是当您不需要时,使用hashmap是浪费的。

比较可能会有所帮助:您可以使用整数做任何事情,也可以使用字符串来完成,那么为什么我们有整数?因为它们较小,可以更快地使用(并提供一些不错的保证,例如它们总是包含一个数字)。

我一直使用地图 - 它是功能最强大,通用的数据结构之一。我主要使用linkedhashmap,但是,当使用字符串作为钥匙时,我会使用Treemap,因为将钥匙排序具有其他好处。

但是:

  • 如果您的密钥是INT,并且您计划使用所有键0..N,请使用数组(请记住 - int比整数更有效)。但是,如果您具有"稀疏值"
  • ,那么地图会更好
  • 如果您需要一个未索引项目的列表,请使用linkedlist
  • 如果您需要存储独特的元素,请使用一组(为什么只需键就浪费空间来保留值)!

记住 - Java为您提供了非常强大的收藏(集合,地图,列表),对于每个功能,它们都具有不同的功能 - 它们在那里是有原因的。

每个数据结构都有其使用,即使可以使用地图作为后端实现许多数据结构,最合适的数据结构是……更合适(通常更有效,开销较少并提供更多功能)

大小无关紧要-5或500个元素,如果它看起来像地图,请使用地图(也许很少有例外情况和角案例,您需要最大的效率和硬编码值更好)。但是,如果看起来像一组 - 使用一组!

最新更新