示例:
我想创建一个包含26个密钥的Hashmap,对于此示例,该密钥将为'A'
到'Z'
。现在让我们说我希望密钥'A'
,'M'
和'Z'
返回123
的相同整数值。创建此映射时,映射是否会进行优化,以便只有一个值存储在内存中?或者它仍将它视为具有3个不同值的3个不同的键,即使3个值相同。
我希望这个问题有道理。
由于
答案 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。