【问题标题】:Java equivalent of C++ std::map?Java 等效于 C++ std::map?
【发布时间】:2010-02-13 17:42:38
【问题描述】:

我正在寻找一个具有 C++ std::map 常用实现特性的 Java 类(据我了解,自平衡二叉搜索树):

  1. 插入/删除/搜索的 O(log n) 性能
  2. 每个元素都由唯一的键和映射的值组成
  3. 键遵循严格的弱排序

我正在寻找具有开源或设计文档的实现;我可能最终会推出自己对原始键/值的支持。

这个问题的风格类似于:Java equivalent of std::deque,其答案是“ArrayDeque from Primitive Collections for Java”。

【问题讨论】:

  • 为什么需要一棵保存原语的树?为什么不直接使用 TreeMap(它是一棵红黑树)?如果你找到一棵可以保存原语的树,那么仍然会有一种 Node 类:即。它不仅仅是您要实例化的原语。
  • 你需要原始的keys还是原始的values?如果值,我同意 Bart:只需使用 TreeMap(或 CSLM 或其他)并使用装箱(因为您首先必须装箱才能将其放入树中)。如果您只想要原始键,Scala 库有 scala.collection.immutable.IntMap 和类似的 LongMap,它们采用 Int(即 java int)或 Long(即 java long)作为原始键。您可以使用 Scala 库而不需要花费太多的 Java 精力——但如果标准库足够了,为什么还要花费那么多精力呢?
  • @Bart K.: 我正在使用原始键和值,对于大多数应用程序,直接存储原始数据的集合将需要更少的空间并产生显着的性能提升。为了回答您的第二点,不需要 Node 类;流行的数据结构一般都有数组实现。
  • 看看这个问题的最新编辑;原始键/值并不是这个问题的真正要求,这应该为更多答案开辟了可能性。
  • @Rudiger,数组在 Java 中也是一个对象。但一开始我不应该那么担心性能。至少在您分析您的应用程序并确认大部分时间用于在树中添加(或删除)内容之前。

标签: java collections binary-tree stdmap


【解决方案1】:

ConcurrentSkipListMap 是一个由跳过列表(具有 O(log n) 性能的自平衡树状结构)支持的排序映射。通常,CSLM 的边界比 TreeMap(这是一个自平衡的红黑树 impl)更严格,因此它可能会执行得更好,并且具有线程安全和并发的好处,而 TreeMap 不是。 CSLM 是在 JDK 1.6 中添加的。

Trove 有一组原始类型的集合以及常见 Java 集合类型的一些其他有趣的变体。

其他感兴趣的集合库包括Google Collection libraryApache Commons Collections

【讨论】:

  • TreeMap(即红黑树)实际上是答案(尽管我重写了 rbtree 的一个版本以使用原语和数组)......对不起,伙计们;当我问这个问题时,我有点醉了,没有意识到答案就在我的眼皮底下。
【解决方案2】:

标准 Java 库中最接近二叉树的类是 java.util.TreeMap,但它不支持原始类型,除了装箱(即 int 包装为 Integer,double 包装为 Double 等)。

java.util.HashMap 可能会为大型地图提供更好的性能。理论上它是 O(1),但其精确的性能特征取决于密钥类的哈希码生成算法。

根据Introduction to Collections:“数组......是唯一支持存储原始数据类型的集合。”

【讨论】:

  • 答案可能会在 Java Collections Framework 之外找到。
  • (+1) 我也想说TreeMap
【解决方案3】:

您也可以查看 commons-collections FastTreeMap

我怀疑你会发现许多支持原始类型而无需装箱的集合,所以就接受它吧。这并不是必须的,因为autoboxing

如果你真的想使用原语(在进行了显示性能不足的基准测试之后!),你可以查看FastTreeMap 的来源并添加处理原语的方法。

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 2011-01-28
    • 1970-01-01
    • 2010-12-08
    • 2010-09-20
    • 2010-10-15
    • 1970-01-01
    • 2016-02-12
    • 2020-07-18
    相关资源
    最近更新 更多