一个很大的疑问!我读到HashMap接受对象的引用,不会复制值来存储数据。所以,如果我有像
这样的东西 HashMap<Integer, Double> map = HashMap<Integer, Double>();
for(int i = 0; i < 100; i++ ) {
Integer key = Integer(i);
Double value = Double(i*2.0);
map.put(key, value);
}
的结果是什么?
map.get(10);
?在for循环中创建了键和值,因此我认为它们在for语句结束时被删除,put(10)给出类似null的东西。但我认为这是一个非常讨厌的行为,因为我不能用一个直接的循环来填充HashMap ...我错了吗?
答案 0 :(得分:3)
我假设您打算询问map.get(10)
的结果是什么,因为map.put(10)
无效。 map.get(10)
将返回其值为20.0
的双精度。
由于map
变量是在for循环之外声明的,因此在for循环结束后,您放在映射中的值将保留在那里。在for循环结束时不会删除键和值,因为map变量保存对它们的引用。
答案 1 :(得分:0)
密钥由refrences保存为(几乎)Java中的所有对象; java不会删除被另一个对象强烈引用的对象。
只有在循环之后没有其他对象引用它们时,才会收集在循环中创建的对象
因为你将它们放入一个hashmap中,所以java会保留它们
另请注意,由于autoboxing
,put(10,...)实际上已被放入(新的整数(10),...)答案 2 :(得分:0)
首先,在Java中,所有对象都是通过引用访问的 - 这里的HashMap没什么特别的。
其次,所有对象都保存在内存中,直到垃圾收集器(GC)决定销毁它们。 GC 可能会在对象不再被引用时立即销毁对象 - 如果它们仍被引用,可能不会销毁它们。
在你的例子中:
map
引用的对象保存对key
和value
引用的相同对象的引用:这些对象无法销毁。map.put(10)
,因为HashMap
没有兼容签名的方法。 put
唯一存在的HashMap
方法需要两个参数。编辑:由于操作符已将map.put(10)
更正为map.get(10)
:它将返回对“i = 10”迭代期间变量value
简要引用的同一对象的引用循环。