1

我有一个问题,我需要在映射中存储键、value1(float) 和 value2(非常长的字符串),其中 value1 可用于每个键,而 value2 仅可用于 1% 的键。

我能想到2个可能的解决方案

  1. 两张地图,如 map1 = map(key1 ,map(key2, value1)) 和 map2 = map(key1, map(key2,value2)) 优点 - 没有不必要的参考变量。缺点 - 存储相同的密钥两次浪费内存。

  2. 使用具有自定义对象值的地图。map1 = map customobj {浮点值1; string value2} pros - 没有重复键。缺点 99% 的 customobj 将具有 value2=null,因此将消耗内存用于引用指针。

基本上我的最终问题是未使用的引用(在 customobj 中)会消耗内存还是编译器会优化它?我倾向于解决方案 2,因为我不想通过存储相同的 key1 和 key2 两次来浪费内存。另一方面,99% 的时间 value2=null,这让我想知道 soln1 是否更好。

我正在使用 Java,我想听听一些建议。

编辑:我没有意识到我没有打印我发布的地图结构,我编辑了那个。key1 和 key2 都是字符串(主要是固定长度的 id 字符串)

4

2 回答 2

2

我会根据密钥大小和类型选择解决方案

解决方案1是-

1)带有键和值1的HashMap(浮点数)

2)带有键和值2(字符串)的HashMap

这只需要额外的空间来存放 1% 的键。如果密钥大小很大,那么我会选择解决方案 2。

解决方案2是——

带有自定义对象的单个 HashMap。使用结构或类创建自定义对象。

尽管引用的内存非常小,但每个对象仍然占用对象开销(16 字节)和填充(4 字节)的常量内存。解决方案 1 中的 HashMap 键可能会为每个键值对占用大约 8 个字节的开销。因此,如果您的密钥大小大于整数或字符,请选择解决方案 2。

于 2013-10-04T18:38:21.977 回答
0

解决方案#3。HashMap 其中 value 是 Fl​​oat 或 CustomObj{float value1; 字符串值2}。在运行时执行 instanceof 以找出哪个是哪个。

那,假设优化甚至是一个问题。过早的优化是万恶之源,对吧?如果您不确定是否需要进行优化,那么只需按照您对正在建模的现实世界的概念化方式进行编码。

于 2013-10-04T18:58:56.020 回答