【问题标题】:Which is faster in accessing elements from Java collections [closed]从Java集合中访问元素的速度更快[关闭]
【发布时间】:2013-11-30 12:53:39
【问题描述】:

我试图了解从 Java 中的集合(如 ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap 等)访问元素时哪个更快。

从这个问题:Suitable java collection for fast get and fast removal,我知道 ArrayList 需要 O(1) 和 TreeMap 作为 O(log n)

其中:Map/ArrayList: which one is faster to search for an element 显示 ArryList 为 O(n),HashMap 为 O(1),TreeMap 为 O(log n)

其中:Why is it faster to process a sorted array than an unsorted array? 表示排序数组比未排序数组快。由于 TreeMap 中的元素是排序的,那么我可以假设所有排序的集合都比未排序的集合更快吗?

请帮助我了解从列表、集合、映射等实现的 java 集合中访问元素时使用哪个更快。

【问题讨论】:

  • 每个集合的 javadoc 解释了集合中每个操作的复杂性。阅读它。
  • 你可以假设任何你想要的,但这并不代表它是真的。仅仅因为 a 已排序的 array此特定实例 中未排序的数组更快,并不意味着 all 已排序 集合比所有使用模式中的所有未排序集合都要快。
  • 如果有一个数据结构总是比其他所有数据结构都好,Java API 将只实现那个数据结构。它提供了多种数据结构,因为不同的数据结构针对不同的目的进行了优化。
  • 如果多个集合满足您的功能要求,并且访问性能很重要,请为您的程序安排每个适当的集合。

标签: java performance collections


【解决方案1】:

每种集合类型都适用于特定场景。没有 fastestbest 集合。

  • 如果您需要使用 index 快速访问元素,ArrayList 就是您的答案。
  • 如果您需要使用 key 快速访问元素,请使用 HashMap
  • 如果您需要快速添加和删除元素,请使用LinkedList(但它的索引访问性能非常很差)。

等等。

【讨论】:

    【解决方案2】:

    这取决于您是要访问基于索引的元素(如果是列表)还是查看集合中是否存在对象

    如果你想访问基于索引的元素,那么 arraylist 更快,因为它实现了 RandomAccess Marker 接口并且在内部由数组支持。

    Set 内部由 Map 支持,因此 Map 和 Set 的性能是相同的(Set 使用 dummy Object 作为键值对中的值)。我建议您使用 HashSet。

    很多程序员没有注意到的问题是,当 Key Object 的散列函数良好时,Hashset 或 HashMap 的性能最好 O(1),即。它为不同的对象产生不同的值(尽管这不是严格的要求)。

    注意:- 如果你的哈希函数不好,它会在内部降级为 LinkedList,并且它的性能会降到 O(n)

    我个人的偏好是使用 EnumMap 或 EnumSet。它只是使用 Enum 值来实现其功能,程序员不必担心 Enum 的 hashcode/equals 函数。对于其他情况,使用 HashSet 或 HashMap(如果你没有使其订购)

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 2011-10-16
      • 1970-01-01
      • 2013-06-18
      相关资源
      最近更新 更多