1

如果我创建一个对象然后将该对象放入 List 或 Map,那么将该对象设置为 null 会影响 List 和 Map 的内容吗?

喜欢:

Object obj = new Object();
List<Object> list = new ArrayList<Object>();
Map<Integer, Object> map = new HashMap<Integer, Object>();

list.add(obj);
map.put(1, obj);

obj = null;

现在如果我希望列表和地图中的内容都为空,那么在这一行之后,有可能吗?如果没有,是否可以实现?如何?

4

4 回答 4

3

如果我创建一个对象然后将该对象放入 List 或 Map,那么将该对象设置为 null 会影响 List 和 Map 的内容吗?

,那不会发生。您不要将对象放在ListorMap中,而是对该对象的引用。因此,当您将原始引用指向 时, ornull中的引用仍将指向同一个实例。ListMap

如果我希望列表和地图中的内容都为空,可以吗?

是的,这是可能的,但您必须手动完成,方法是遍历您的List并将每个元素设置为null. 里面也是一样的Map,你必须null手动设置每个值。

于 2012-11-29T05:49:34.777 回答
0
Object obj = new Object();

请参阅此处Object obj是 Object 类型的参考,其中包含new Object();

当您这样做时,list.add(obj);列表0th索引将保留与地图相同的引用obj和相同的地图。

现在,当你这样做obj = null;意味着 nowobj引用将保持 null 而不是以前Object的,它不会影响 object

在这里看到你new Object();还没有无法访问,因为list and map仍然持有参考。如果图片中没有商品,Garbage collector则将收集该商品,object因为该对象将无法访问。

WeakHashMap<K,V>是 map where 的一个例子。WeakHashMap 中的条目在其键不再常用时将被自动删除。更准确地说,给定键的映射的存在不会阻止该键被垃圾收集器丢弃,也就是说,使其可终结,最终确定,然后回收。当一个键被丢弃时,它的条目被有效地从映射中删除,所以这个类的行为与其他映射实现有些不同。

于 2012-11-29T05:50:34.517 回答
0

现在如果我希望列表和地图中的内容都为空,那么在这一行之后,有可能吗?如果没有,是否可以实现?如何?

首先,不要将您的设置obj为空。循环遍历列表和映射,将元素与 obj 进行比较,如果匹配,则将它们设置为 null。后来obj也设置为null。

for(int i=0; i<list.size(); i++) {
  if(list.get(i) == obj) {
    list.set(i, null);
    break;
  }
}

for(Integer key: map.keySet()) {
  if(map.get(key) == obj) {
    map.put(key, null);
  }
  break;
}

obj = null;
于 2012-11-29T06:11:00.523 回答
0

如果我创建一个对象然后将该对象放入 List 或 Map,那么将该对象设置为 null 会影响 List 和 Map 的内容吗?

不,因为 theList和 theMap仍然对该对象有强引用。所以垃圾收集器无法从内存中回收对象。

现在如果我希望列表和地图中的内容都为空,那么在这一行之后,有可能吗?如果没有,是否可以实现?如何?

至于 List 和 Map,您可能希望使用Wea​​kReferences来执行以下操作:

Object obj = new Object;
WeakReference<Object> weakReference = new WeakReference<>(obj);

List<WeakReference> list = new ArrayList<>();
list.add(weakReference);

Map<Integer, WeakReference> map = new HashMap<>();
map.put(1, obj);

//Now set the only strong reference to null
obj = null;

因此,如果发生垃圾收集,那么当您尝试执行以下操作时:

map.get(1).get(); //May return null if GC ocurred
list.get(0).get(); // Same here

但是您仍然必须从列表中删除地图条目和元素。

对于此清理,您必须使用ReferenceQueue来迭代您的MapList.

我引用这篇文章

只有弱可达的对象(对它的最强引用是 WeakReferences)将在下一个垃圾回收周期被丢弃 [...]

于 2012-11-29T06:03:03.060 回答