我正在使用Map
接口实现类似树的结构,如下面的声明:
Map<String, Map<String, Map<Integer, Double>>>
目前我正在使用HashMap
实施。
加载大量数据后,我发现该程序消耗4GB的RAM。
在使用Serializable
接口持久化整个实体时,生成的文件大小仅为1GB。
我可以在这里使用的内存效率最高的Map
实现是什么?
答案 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为例。这将节省大量内存,因为基元存储为基元而不是对象。