【问题标题】:Java equivalent of std::dequeJava 等价于 std::deque
【发布时间】:2010-09-25 21:22:09
【问题描述】:

我是一个来自 C++/STL 的相对较新的 Java 程序员,正在寻找具有这些特征的类(据我了解,C++ std::deque 具有):

  1. 在开始/结束处插入/删除的 O(1) 性能
  2. 按索引查找的 O(1) 性能
  3. 是可增长的集合(不需要固定大小的界限)

有与此等效的 Java 吗?我发现 Java 1.6 [ArrayDeque] 类具有插入/删除和可增长的特性,但似乎没有按索引查找,除非你调用 toArray(),它不会是 O(1)。

【问题讨论】:

    标签: java collections deque


    【解决方案1】:

    这是一个现成的circular buffer implemented in Java, CircularArrayList。但是,它在创建后不可增长。 (免责声明:此链接指向我自己的网站

    网上流传的另一个选项是one from the Java Specialists Newsletter。我从来没有用过那个,原因如下:

    1. 不完整 - (“此方法留给读者作为练习”)
    2. 它不支持与 Java 集合框架中的其他集合一致的通用元素类型。
    3. 与其遵循 AbstractList 的 Javadoc 推荐的扩展过程,它会变得不必要地复杂,因此可能存在错误。

    【讨论】:

      【解决方案2】:

      有趣...我刚刚读完Java Generics and Collections,它简要讨论了这种集合,包括指向Java Specialists' Newsletter 的链接,其中包括一个可能满足我需要的 CircularArrayList。

      【讨论】:

        【解决方案3】:

        我的默认方法是将我自己的类组合在一起,并将 ArrayList 作为底层实现(例如,将我自己的类的索引映射到 ArrayList 索引)...但我讨厌重新发明轮子,尤其是当很有可能搞砸的时候...

        【讨论】:

        • 我删除了关于 HashMap 的帖子,但我认为对于任意插入而言,这将是 ArrayList 的改进。
        【解决方案4】:

        Java 的原始集合有一个带有 get(int idx) 方法的 ArrayDeque。

        http://sourceforge.net/projects/pcj

        但我不能保证这个项目的质量。

        另一种方法是获取 JDK ArrayDeque 源并自己添加 get(int idx) 方法。应该比较容易。

        编辑:如果您打算以高度多线程的方式使用双端队列,我会选择“修补 JDK 的 ArrayDeque”路线。此实现已经过彻底测试,并在新的 java.util.concurrent ForkJoin 框架中使用。

        【讨论】:

        • GNU 类路径 ArrayDeque 的源代码在这里:fuseyism.com/classpath/doc/java/util/ArrayDeque-source.html。添加 get(i) 或使其实现 List 应该相当容易
        • PCJ 仅适用于原始类型,这反而限制了它的实用性。
        • 有趣... GNU 的东西让我害怕(尽管您列出的 ArrayDeque 代码的许可证显示知识共享...奇怪)因为我在商业环境中工作并且不能使用任何GPL 代码。
        • 您可以在backport-jsr166.sourceforge.net 使用JSR166 backport,它已发布到公共领域;没有许可问题。
        猜你喜欢
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        • 1970-01-01
        • 2013-09-23
        • 1970-01-01
        • 2022-09-23
        • 2018-12-16
        • 1970-01-01
        相关资源
        最近更新 更多