如果我创建一个对象然后将该对象放入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,是否可能? 如果没有,是否可以实现?怎么样?
答案 0 :(得分:3)
如果我创建了一个对象,那么将该对象放入List或Map中 将该对象设置为null会影响List和Map的内容吗?
否,这不会发生。您不会将对象放在List
或Map
中,而是放在该对象的引用中。因此,当您将原始参考点设为null
时,List
或Map
中的引用仍将指向同一个实例。
如果我希望列表中的内容和地图都为空,是否可以?
是的,但是您必须手动执行此操作,方法是迭代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的内容吗?
没有。因为List
和Map
仍然对该对象有强引用。因此垃圾收集器无法从内存中回收对象。
现在在此行之后如果我想要列表中的内容和地图都是 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来迭代Map
和List
。
我引用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;