在循环中填充HashMap

时间:2014-09-07 20:35:01

标签: java hashmap

一个很大的疑问!我读到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 ...我错了吗?

3 个答案:

答案 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引用的对象保存对keyvalue引用的相同对象的引用:这些对象无法销毁。
  • 如果稍后您不再持有对HashMap对象的任何引用,它可能会被GC销毁,并且GC也可能决定销毁密钥和值,如果它们仅被引用HashMap中。请注意,何时会发生垃圾收集时无法保证:它不一定会立即发生。
  • 您不能map.put(10),因为HashMap没有兼容签名的方法。 put唯一存在的HashMap方法需要两个参数。

编辑:由于操作符已将map.put(10)更正为map.get(10):它将返回对“i = 10”迭代期间变量value简要引用的同一对象的引用循环。