2012-04-11 33 views
2

虽然内部,我推测一般使用ConcurrentIdentityWeakKeyHashMap是安全的。但是,下面的代码:ConcurrentIdentityWeakKeyHashMap和Integer键

ConcurrentIdentityWeakKeyHashMap map = new ConcurrentIdentityWeakKeyHashMap(); 
for(int key = 0; key < 132; key++){ 
    map.put(key, key); 
} 
for(int key = 0; key < 132; key++){ 
    System.out.println(map.get(key)); 
} 

生产:

0 
1 
.. 
124 
125 
126 
127 
null 
null 
null 
null 

这是(即“不应与使用整数”或“仅供内部使用”)中的错误或在我身边一个误解?

编辑:基于卢西亚诺的意见,我改变了代码一点,以使其保持在一个参考(我希望至少)非常相同的整数列表和地图:

ArrayList<Integer> list = new ArrayList<Integer>(132); 
ConcurrentIdentityWeakKeyHashMap<Integer, Integer> map = new ConcurrentIdentityWeakKeyHashMap<Integer, Integer>(); 
for(int key = 0; key < 132; key++){ 
    Integer key2 = key; 
    list.add(key2); 
    map.put(key2, key2); 
} 
for(int key = 0; key < 132; key++){ 
    System.out.println(map.get(list.get(key))); 
} 

现在,它的工作原理...

回答

1

Integer最多可以在Integer类中预先存储127个,所以它们永远不会被垃圾收集。

+0

好的,那么有什么意义呢?你的意思是说,键值高达127的数值从未被GCC控制过,并且所有上面的数据都会立即被GCed? – user462982 2012-04-11 22:51:16

+0

此外,它使用标识(==)比较键,因此当您获取(键)时,自动装箱会使用键号创建一个新的Integer对象,但该对象与保存在Map上的对象不同,所以identity等于运算符返回false,因此您得到一个空值。 – Luciano 2012-04-11 22:59:28

相关问题