Java ConcurrentIdentityWeakKeyHashMap和整数键
虽然是内部的,但我认为通常使用ConcurrentIdentityWeakKeyHashMap是安全的。但是,以下代码:Java ConcurrentIdentityWeakKeyHashMap和整数键,java,integer,hashmap,netty,internal,Java,Integer,Hashmap,Netty,Internal,虽然是内部的,但我认为通常使用ConcurrentIdentityWeakKeyHashMap是安全的。但是,以下代码: ConcurrentIdentityWeakKeyHashMap map = new ConcurrentIdentityWeakKeyHashMap(); for(int key = 0; key < 132; key++){ map.put(key, key); } for(int key = 0; key < 132; key++){
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));
}
这是我的错误还是误解(即“不应与整数一起使用”或“仅限内部使用”)
编辑:根据Lucianos的评论,我对代码做了一些修改,使其包含对列表和地图中(我希望至少是)非常相同的整数的引用:
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)));
}
ArrayList list=新的ArrayList(132);
ConcurrentIdentityWeakKeyHashMap=新的ConcurrentIdentityWeakKeyHashMap();
用于(int key=0;key<132;key++){
整数key2=键;
列表。添加(键2);
地图放置(键2,键2);
}
用于(int key=0;key<132;key++){
System.out.println(map.get(list.get(key));
}
现在,它可以工作了…整数在Integer类中预先设定了多达127个整数,因此它们将永远不会被垃圾收集。好的,那么这有什么意义呢?你的意思是说键数高达127的值永远不会被GCed,而上面的所有内容都会立即被GCed?此外,它使用identity(=)来比较键,因此当你得到(键)时,自动装箱会创建一个带有键号的新整数对象,但该对象与保存在地图上的对象不同,因此identity equals操作符返回false,因此,您会得到一个空值。
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)));
}