如果值重复,Hashmaps会优化内存吗?

时间:2011-03-25 22:48:02

标签: java

示例:

我想创建一个包含26个密钥的Hashmap,对于此示例,该密钥将为'A''Z'。现在让我们说我希望密钥'A''M''Z'返回123的相同整数值。创建此映射时,映射是否会进行优化,以便只有一个值存储在内存中?或者它仍将它视为具有3个不同值的3个不同的键,即使3个值相同。

我希望这个问题有道理。

由于

2 个答案:

答案 0 :(得分:5)

简而言之,没有。

某些类可能会在某些情况下缓存类似的变量,但HashMap本身不会。

现在,对于整数,如果你使用Integer myInt = Integer.valueOf(123)获取整数,那么它将始终返回相同的Integer引用,但这仅仅是因为Integer.valueOf()具有缓存的机制最近的256 Integers为0.你不能也不应该依赖这种机制来提高内存效率。

如果您有以下内容,您可以做出一些假设:

Map<String,Integer> map = new HashMap<String,Integer>();

Integer myInt = new Integer(123); // one Integer object

// add it 3 times
map.put("A",myInt);
map.put("M",myInt);
map.put("Z",myInt);

您可以认为:

Map中有3个对整数的引用(如指针),它们会占用一些内存。 有一个Integer对象也会占用内存。

答案 1 :(得分:2)

HashMap不会以任何方式试图通过“重用”价值元素来节省空间(这需要它将每个附加值与所有现有值相比较,这将是非常昂贵的 - 毕竟,只有才能进行快速查找。但是,Java本身保留了一个小的Integer值的内部缓存,我认为这是在自动装箱时使用的。因此,在这种特殊情况下,如果您两次调用yourHashMap.add(42),则hashmap实际上将包含两个对相同 Integer实例的引用,值为42。