【问题标题】:What is the actual datastructure used in implementation of collection and their order?收集实现中使用的实际数据结构及其顺序是什么?
【发布时间】:2010-04-24 21:36:11
【问题描述】:

Java 中使用了不同的集合,例如 hashtable、hashset、vector、treeset、treemap 和 hashmap。它们是如何在内部实现的?这些集合使用的实际数据结构是什么?还有,什么是秩序?

如果我们稍微讨论一下收集的实现会很好。

【问题讨论】:

标签: java big-o data-structures


【解决方案1】:

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

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

  • get(index) - O(1)
  • 添加(对象) - O(n)
  • insertAt(int pos, 对象值) - O(n)
  • 移除(对象) - O(n)

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

通常在 Java 集合中,尤其是在列表中,在它的两个具体实现 ArrayListLinkedList 之间存在这种常见的比较。 LinkedList的顺序如下。

  • get(index) - O(n)
  • add(Object) - O(1)(前提是链表中维护了一个现成的最后一个指针)
  • insertAt(int pos, 对象值) - O(n)
  • 移除(对象) - O(n)

【讨论】:

    【解决方案2】:

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

    更多信息可在这些类的 JavaDoc 中找到。例如,对于TreeSet,它声明:

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

    【讨论】:

      【解决方案3】:

      关于订单我发现一些有用的东西:

      我发现下面的帖子对于大 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

      【讨论】:

        【解决方案4】:

        你可能会发现这个illuminating

        【讨论】:

          【解决方案5】:

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

          LinkedList 集合中删除的最差复杂度应该是 O(1),因为它内部使用双链表数据结构,这使得删除单个特定对象变得容易.

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-12-03
            • 1970-01-01
            • 1970-01-01
            • 2010-09-06
            • 2020-02-02
            • 2014-06-30
            相关资源
            最近更新 更多