java空实例变量内存占用

时间:2013-10-04 18:21:50

标签: java data-structures hashmap

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

我可以想到2种可能的解决方案

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

  2. 使用一个带有自定义对象值的地图。 map1 = map customobj {float value1; string value2} 专业人士 - 没有重复的关键。缺点 - 99%的customobj将具有value2 = null,因此将占用内存作为参考指针。

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

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

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

2 个答案:

答案 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以找出哪个是哪个。

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