如何重置List或Map的内容?

时间:2012-11-29 05:43:02

标签: java object reference

如果我创建一个对象然后将该对象放入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;

现在在此行之后如果我想要列表中的内容和映射都为null,是否可能? 如果没有,是否可以实现?怎么样?

4 个答案:

答案 0 :(得分:3)

  

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

,这不会发生。您不会将对象放在ListMap中,而是放在该对象的引用中。因此,当您将原始参考点设为null时,ListMap中的引用仍将指向同一个实例。

  

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

是的,但是您必须手动执行此操作,方法是迭代List并将每个元素设置为null。 <{1}}中的内容相同,您必须手动将每个值设置为Map

答案 1 :(得分:0)

Object obj = new Object();

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

的引用

当您执行list.add(obj);时,列表0th索引将保留obj的相同引用,并且对于地图也是如此。

现在当你执行obj = null;时,这意味着现在obj引用将保留为空而不是之前的Object它不会影响对象

请在此处查看您的new Object();尚无法访问,因为list and map仍然保留了引用。如果没有进入图片,那么Garbage collector将收集object,因为该对象将无法访问。

  

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

答案 2 :(得分:0)

  

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

没有。因为ListMap仍然对该对象有引用。因此垃圾收集器无法从内存中回收对象。

  

现在在此行之后如果我想要列表中的内容和地图都是   null,有可能吗?如果没有,是否可以实现?怎么样?

对于列表和地图,您可能希望使用WeakReferences来执行以下操作:

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

我引用this article

  

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

答案 3 :(得分:0)

  

现在在此行之后如果我想要列表中的内容和映射都为null,是否可能?如果没有,是否可以实现?怎么样?

首先,不要将obj设置为null。循环遍历列表和映射,将元素与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;