【问题标题】:A Java List as quick as like a Java Map?Java List 和 Java Map 一样快?
【发布时间】:2013-12-04 17:22:04
【问题描述】:

我想找到一个简化的 Java Map 或 List,我不关心 values 集合中的实际值是什么,而只关心:

boolean containsKey(Object key): if the key exists
void remove(Object key): remove the entry of the key

一方面,我想通过仅使用键集(如 Java 列表)来节省内存,另一方面,我想在 O(1) 时间内运行以上 2 个方法。订单也不在乎。那么这在Java中可能吗?谢谢

【问题讨论】:

  • 可能是一个 OrderedSet(或者如果您不关心顺序,则只是 Set)是您正在寻找的?
  • HashSet 似乎是您正在寻找的收藏。
  • @Taylor 是的,顺序无所谓。我想用谷歌搜索 OrderedSet,但从未听说过
  • @Jun 然后使用 HashSet,如下 Jeroen 解释的那样
  • @Jun HashSet 在内部使用 HashMap 将占用相似的内存量,containsremove 也是 O(1)。

标签: java performance list map


【解决方案1】:

使用HashSet。这将只有一个值列表,而不是像 Map 这样的键值对。

假设哈希函数将元素正确地分散在桶中,此类为基本操作(添加、删除、包含和大小)提供恒定的时间性能。

快速搜索显示this

【讨论】:

  • 请注意,Set 在后台使用Map 来实现此目的。 HashSet 使用 HashMapLinkedHashSet 使用 LinkedHashMapTreeSet 使用 TreeMap。所以,从问题:一方面,我想通过只使用键集(如Java List)来节省内存,另一方面,我想在O(1)中运行以上2种方法时间最好改用Map
  • 这取决于他的需要,我无法真正弄清楚他想要做什么。如果他有一个键值对,那么他应该使用HashMap,如果只是键,那么他应该使用HashSet
  • Collections#newSetFromMap 已经注意到这一点。
【解决方案2】:

您可以为此使用LinkedHashSet。如果你需要一个简单的界面,你可以想出一个新的:

interface SimpleSet{
    boolean containsKey(Object key);
    boolean remove(Object key);
}

class MySimpleSet extends LinkedHashSet implements SimpleSet{
    //... necessary contructors ...

    @Override
    public boolean containsKey(Object key) {
        return contains(key);
    }
}

并像这样声明它:

SimpleSet set = new MySimpleSet();

内存消耗更新

LinkedHashSet 每个存储元素占用约 40-50 个字节。因此,如果它太多,您可以考虑来自 Trove4j 的 THashSetTLinkedHashSet,根据本文判断,每个元素约为 4-8 个字节:Memory consumption of popular Java data types

【讨论】:

    猜你喜欢
    • 2020-01-26
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2012-11-30
    相关资源
    最近更新 更多