java中大多数内存效率高的地图

时间:2012-11-25 14:25:21

标签: java memory-management map

我正在使用Map接口实现类似树的结构,如下面的声明:

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

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

我可以在这里使用的内存效率最高的Map实现是什么?

2 个答案:

答案 0 :(得分:4)

如果要将(String,String,Integer)映射到Float,那么最好的办法是使用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);
    }
}

答案 1 :(得分:3)

这里有两种地图。一个具有String键和Map值的。为此,我可能会使用Google Guava's ImmutableMap,如果不变性对您而言。它可能不会为您节省大量内存,但它可能会为您节省一些,并且比普通的HashMap执行得更好。

对于具有Integer键和Double值的其他Map,您应该使用专门的Map实现来存储基元而不是对象。以Trove4j's TIntDoubleHashMap为例。这将节省大量内存,因为基元存储为基元而不是对象。