4

Map我正在使用类似于以下声明的接口实现树状结构:

Map<String, Map<String, Map<Integer, Double>>>

目前我正在使用该HashMap实现。加载大量数据后,我看到程序消耗了 4GB 的 RAM。在使用接口持久化整个实体Serializable时,生成的文件大小仅为 1GB。

我可以在这里使用的最节省内存的Map实现是什么?

4

2 回答 2

4

如果您想将 (String,String,Integer) 映射到 Float,那么最好的办法是使用 a Map<MyKey, Float>MyKey其定义如下:

public final class MyKey {
    private final String a;
    private final String b;
    private final Integer c;

    public MyKey(String a, String b, Integer c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    // getters, if needed

    @Override
    public int hashCode() {
        return Objects.hash(a, b, c);
    }

    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        }
        if (!(o instanceof MyKey)) {
            return false;
        }
        MyKey other = (MyKey) o;
        return Objects.equal(a, o.a)
               && Objects.equal(b, o.b)
               && Objects.equal(c, o.c);
    }
}
于 2012-11-25T16:13:25.533 回答
3

这里有两种地图。一种具有字符串键和映射值。为此,如果您可以接受不变性,我可能会使用Google Guava 的 ImmutableMap。它可能不会为您节省很多内存,但它可能会为您节省一些,并且比普通的 HashMap 执行得更好。

对于具有 Integer 键和 Double 值的其他 Map,您应该使用存储原语而不是对象的专用 Map 实现。例如看一下Trove4j 的 TIntDoubleHashMap。这将为您节省大量内存,因为原语存储为原语而不是对象。

于 2012-11-25T14:32:38.183 回答