从Java集合中访问元素的速度更快

时间:2013-11-30 12:53:40

标签: java performance collections

我试图了解哪些方法可以更快地访问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集合中的元素更快。

2 个答案:

答案 0 :(得分:16)

每种集合类型都适用于特定场景。没有最快的最佳集合。

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

等等。

答案 1 :(得分:3)

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

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

集合由Map内部支持,因此Map和Set的性能相同(Set使用虚拟对象作为键值对中的值)。我建议你使用HashSet。

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

注意: - 如果你是Hashing功能不好,它会在内部降级为LinkedList,其性能会降低到O(n)

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