实现收集及其顺序时使用的实际数据结构是什么?

时间:2010-04-24 21:36:11

标签: java big-o data-structures

Java中使用了不同的集合,如hashtable,hashset,vector,treeset,treemap和hashmap。它们是如何在内部实施的?这些集合使用的实际数据结构是什么?而且,什么是订单?

如果我们稍微讨论一下集合的实现,那将会很好。

5 个答案:

答案 0 :(得分:1)

此方法Collections.sort()内部调用Arrays.sort()。这使用合并排序对具有O(nlogn)顺序的数据进行排序。还有一个信息是,如果要排序的元素数量小于7,则使用插入排序。

VectorArrayList一样复杂,因为它使用了一个简单的数组

  • get(index) - O(1)
  • add(Object) - O(n)
  • insertAt(int pos,Object value) - O(n)
  • 删除(对象) - O(n)

还有一件事是HashSet内部使用HashMap只担心地图的键和被忽略或未使用的对象,因此没有两种不同的实现。 HashMap通过为每个对象生成唯一的哈希码来使用无冲突或理想哈希。因此,对于数据的插入和检索,顺序理想情况下为1。

通常在Java集合中,特别是在列表中,通常会在其两个具体实现(ArrayListLinkedList之间进行比较。 LinkedList的顺序如下。

  • get(index) - O(n)
  • add(Object) - O(1)(如果在链表中维护了一个现成的最后一个指针)
  • insertAt(int pos,Object value) - O(n)
  • 删除(对象) - O(n)

答案 1 :(得分:0)

集合实现类完全按其数据结构命名。所以HashSet和HashMap使用哈希作为底层数据结构,而TreeSet和TreeMap使用二叉树。

这些类的JavaDoc中提供了更多信息。例如,对于TreeSet,它声明:

  

此实现为基本操作(添加,删除和包含)提供了有保证的log(n)时间成本。

答案 2 :(得分:0)

与订单相关我发现了一些有用的东西:

我发现以下帖子对Big O表示法非常有用: Big-O summary for Java Collections Framework implementations?

并在精确的网页下方 http://simplenotions.wordpress.com/2009/05/13/java-standard-data-structures-big-o-notation/

下面有关每个集合的实验结果的详细信息 http://java.sun.com/docs/books/performance/1st_edition/html/JPAlgorithms.fm.html

答案 3 :(得分:0)

您可能会发现此illuminating

答案 4 :(得分:0)

我只想在bragBoy答案中添加一个更正:

在LinkedList集合中删除的最差复杂度应该为O(1),因为其内部使用双链表数据结构可以很容易地删除单个特定对象