我有一个问题,我需要在地图中存储键,value1(float)和value2(非常长的字符串),其中value1可用于每个键,value2仅适用于1%的键。
我可以想到2种可能的解决方案
两个地图,如map1 = map(key1,map(key2,value1))和map2 = map(key1,map(key2,value2)) 专业 - 没有不必要的参考变量。缺点 - 存储相同的密钥两次浪费内存。
使用一个带有自定义对象值的地图。 map1 = map customobj {float value1; string value2} 专业人士 - 没有重复的关键。缺点 - 99%的customobj将具有value2 = null,因此将占用内存作为参考指针。
基本上我的最终问题是未使用的引用(在customobj中)消耗内存还是编译器会优化它?我倾向于soln 2,因为我不想通过两次存储相同的key1和key2来浪费内存。另一方面99%的时间值value2 = null,这让我想知道soln1是否更好。
我正在使用Java,我想听听一些建议。
编辑:我没有意识到SO没有打印我发布的地图结构,我编辑了。 key1和key2都是字符串(大多数是固定长度的id字符串)答案 0 :(得分:2)
我会根据密钥大小和类型选择解决方案
解决方案1是 -
1)带键和值1(浮动)的HashMap
2)带键和值2的HashMap(字符串)
这只需1%的钥匙就需要额外的空间。如果密钥大小很大,那么我会选择解决方案2.
解决方案2是 -
使用自定义对象的单个HashMap。使用结构或类创建自定义对象。
虽然引用的内存非常小,但每个对象仍占用对象开销(16字节)和填充(4字节)的常量内存。解决方案1中的HashMap键可能会占用每个键值对大约8字节的开销。因此,如果您的密钥大小大于整数或字符,请选择解决方案2.
答案 1 :(得分:0)
解决方案#3。 HashMap,其中value是Float或CustomObj {float value1;字符串值2}。在运行时执行instanceof以找出哪个是哪个。
那,假设优化甚至是一个问题。过早优化是万恶之源,对吧?如果您还不确定是否需要进行优化,那么只需按照您正在建模的现实世界的方式进行编码。