Java相当于C ++ std :: map?

时间:2010-02-13 17:42:38

标签: java collections binary-tree stdmap

我正在寻找一个具有C ++ std :: map常用实现特性的Java类(据我所知,它是一个自平衡二进制搜索树):

  1. 插入/删除/搜索的O(log n)性能
  2. 每个元素由唯一键和映射值
  3. 组成
  4. 按照严格的弱订单
  5. 我正在寻找使用开源或设计文档的实现;我可能最终会支持原始键/值。

    这个问题的风格类似于:Java equivalent of std::deque,其答案是“来自Java的原始集合的ArrayDeque”。

3 个答案:

答案 0 :(得分:7)

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

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

其他感兴趣的收藏库包括Google Collection libraryApache Commons Collections

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:2)

您也可以查看commons-collections FastTreeMap

我怀疑你会发现许多不支持拳击的原始类型的集合,所以只需要使用它。由于autoboxing,这不一定是必需的。

如果你真的想使用原语(在制作表现不佳的基准之后!),你可以看到FastTreeMap的来源并添加处理原语的方法。