一种可能的数据结构是映射的层次结构,导致字符串数组。例如:
HashMap<Model, HashMap<Topic, String[]>> map;
查询函数将如下所示:
public String query(Model model, Topic topic, int x) {
HashMap<Topic, String[]> childMap = map.get(model);
if (childMap == null) {
return null;
}
String[] list = childMap.get(topic);
if (list == null) {
return null;
}
return list[x];
}
假设您的模型和主题结构实现hashCode()
并equals()
合理,查询性能应该是相当不错的。
一个潜在的弱点:我假设您需要索引大量模型/主题组合以及相关的字符串列表(如果没有,您可能不会询问优化)。我的猜测是子 String[] 数组会消耗大量内存。每个数组都是一个 Java 对象(大约 20 个字节)+ 每个数组位置的指针。
那里有2条建议:
String[]
1)如果许多模型/主题组合共享同一组字符串,您可以通过共享这些实例获得相当多的收益。
2) 如果您使用的是 64 位 VM,请务必使用压缩的普通对象指针 ( -XX:+UseCompressedOops
)。这至少会使大多数指针保持 4 个字节而不是 8 个字节。自 1.6.0_23 以来,压缩的 OOP 是默认设置,因此相对较新的 VM 将在此处为您节省一些内存。