假设我有一个很好的密钥,但不适合在java中使用映射

假设我有一个很好的密钥,但不适合在java中使用映射,java,data-structures,arraylist,hashmap,Java,Data Structures,Arraylist,Hashmap,可能重复: 自从在Java中遇到映射以来,我一直在广泛地使用它们。尤其是HashMap对于许多场景来说都是一个很好的选择。似乎它在每个类别中都胜过了ArrayList——有人说迭代是不可预测的,但为此我们有LinkedHashMap 所以,我的问题是:如果我们有一个固定不变的键,为什么不一直使用HashMap 此外,当键是连续整数时,是否适合使用类似于HashMap的东西作为非常小的值(使用ArrayList)(如果它们不是基于0,只需使用偏移量)。这对于访问(特别是随机访问)和更新来说效率更

可能重复:

自从在Java中遇到
映射以来,我一直在广泛地使用它们。尤其是
HashMap
对于许多场景来说都是一个很好的选择。似乎它在每个类别中都胜过了
ArrayList
——有人说迭代是不可预测的,但为此我们有
LinkedHashMap

所以,我的问题是:如果我们有一个固定不变的键,为什么不一直使用
HashMap


此外,当键是连续整数时,是否适合使用类似于
HashMap
的东西作为非常小的值(使用
ArrayList
)(如果它们不是基于0,只需使用偏移量)。这对于访问(特别是随机访问)和更新来说效率更高。否则,当然,
HashMap
(或者,正如您所说,
LinkedHashMap
)是非常有用的数据结构


我相信
HashMap的默认初始大小是16个bucket,因此对于非常小的列表来说会有一点开销。但是,除非你创建了很多映射,否则它不应该是编码中的一个因素。

当你的键是顺序整数时,使用
数组列表(如果它们不是基于0,就使用偏移量)它的访问(特别是随机访问)和更新效率更高。否则,当然,
HashMap
(或者,正如您所说,
LinkedHashMap
)是非常有用的数据结构


我认为
HashMap
的默认初始大小是16个bucket,因此非常小的列表会有一点开销。但是,除非您创建了很多映射,否则它不应该是编码中的一个因素。

与数组(或ArrayList)相比,HashMap的开销很大:

  • 您需要对密钥进行散列,以将索引放入支持数组,然后存储值和密钥。这比数组速度慢,占用的内存也多。当密钥较大或复杂时,这一点更为重要,因为散列时间较长或占用更多空间
  • 您还需要在每次查找值时散列该键
  • 调整ArrayList的大小时,您只需创建一个新数组并复制所有内容。调整HashMap的大小时,您创建一个新数组,然后重新计算哈希值(这样它们将分布在新数组中)
  • HashMap在满的时候性能很差,所以它们通常会留下大约25%的空间是空的
这些都是非常次要的,所以您可以不必一直使用HashMap(事实上,这就是PHP所做的),但是在您并不真正需要HashMap的时候使用它是浪费的


比较可能会有帮助:任何你可以用整数做的事情,你也可以用字符串做,那么为什么我们要用整数呢?因为它们更小,处理起来更快(并且提供了一些很好的保证,比如它们总是包含一个数)。

与数组(或ArrayList)相比,HashMap有很大的开销:

  • 您需要对密钥进行散列,以将索引放入支持数组,然后存储值和密钥。这比数组速度慢,占用的内存也多。当密钥较大或复杂时,这一点更为重要,因为散列时间较长或占用更多空间
  • 您还需要在每次查找值时散列该键
  • 调整ArrayList的大小时,您只需创建一个新数组并复制所有内容。调整HashMap的大小时,您创建一个新数组,然后重新计算哈希值(这样它们将分布在新数组中)
  • HashMap在满的时候性能很差,所以它们通常会留下大约25%的空间是空的
这些都是非常次要的,所以您可以不必一直使用HashMap(事实上,这就是PHP所做的),但是在您并不真正需要HashMap的时候使用它是浪费的


比较可能会有帮助:你可以用整数做任何事情,你也可以用字符串做,那么为什么我们要用整数呢?因为它们更小,处理起来更快(并且提供了一些很好的保证,比如它们总是包含一个数字).

我一直在使用映射-它是功能最强大、用途最广泛的数据结构之一。我主要使用LinkedHashMap,但在使用字符串作为键时,我使用TreeMap,因为对键进行排序有额外的好处

然而:

  • 如果您的键是int,并且您计划使用所有键0..n,请使用 数组(记住-int比整数更有效)。但是如果你有“稀疏值”,映射会更好
  • 如果需要未编制索引的项目列表,请使用linkedlist
  • 如果需要存储唯一的元素,请使用集合(如果只需要键,为什么要浪费空间来保留值)
记住——Java为您提供了非常强大的集合(集合、映射、列表),对于每一个集合,都有多个具有不同功能的实现——它们的存在是有原因的

每个数据结构都有其用途,即使许多数据结构可以使用映射作为后端来实现,但最合适的数据结构……更合适(而且通常更高效,开销更少,功能更多)


大小无关紧要-5或500个元素,如果它看起来像一个映射,请使用映射(可能存在少数例外情况和角落情况,需要最大效率,硬编码值更好)但是,如果它看起来像一个集合-使用集合!

我一直使用映射-它是功能最强大、用途最广泛的数据结构之一。我主要使用LinkedHashMap,但是,当使用字符串作为键时,我使用TreeMap,因为对键进行排序有额外的好处

然而:

  • 如果您的键是int,并且您计划使用所有键0..n,请使用 数组(记住-int比整数更有效)