我试图了解哪些方法可以更快地访问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集合中的元素更快。
答案 0 :(得分:16)
每种集合类型都适用于特定场景。没有最快的或最佳集合。
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(如果你没有订购)