清除Java中的对象或将其设置为null

我最近正在研究释放Java对象占用的内存。这样做的时候,我对如何在Java中复制对象(浅/深)以及如何避免在使用中意外清除/无效化对象感到困惑。

请考虑以下情形:

  1. 将a ArrayList<Object>作为参数传递给方法。
  2. 将a传递ArrayList<Object>给要由线程处理的可运行类。
  3. ArrayList<Object>放入HashMap

现在,在这些情况下,如果我调用list =

null;list.clear();,对象将如何处理?在哪种情况下丢失对象,在哪种情况下仅将引用设置为null?

我想这与对象的浅层复制和深层复制有关,但是在哪种情况下会发生浅表复制,而在Java中会在哪种情况下发生深层复制?

回答:

首先,您永远不会将 对象 设置为null。这个概念没有任何意义。您可以指定的值null变量

,但你需要非常仔细地“变量”和“对象”的概念区别开来。完成后,您的问题会自动回答:)

现在,就“浅表副本”还是“深表副本”而言,在这里应该避免使用“浅表副本”一词,因为通常浅表副本涉及创建一个新对象,而只是直接复制现有对象的字段。深层副本还将获取这些字段所引用的对象的副本(用于引用类型字段)。这样的简单分配:

ArrayList<String> list1 = new ArrayList<String>();

ArrayList<String> list2 = list1;

......没有做 任何 浅表复制或在这个意义上的深层复制。它只是复制参考。在上面的代码之后,list1并且list2是独立变量-

当前它们恰好具有相同的值(引用)。我们可以更改其中一个的值,而不会影响另一个:

list1 = null;

System.out.println(list2.size()); // Just prints 0

现在,如果不更改 变量 ,而是对变量值所引用的对象进行更改,那么该更改也将通过另一个变量可见:

list2.add("Foo");

System.out.println(list1.get(0)); // Prints Foo

回到最初的问题-您从不将 实际对象 存储在地图,列表,数组等中。您仅存储 引用

。仅当不再有“实时”代码到达该对象的方式时,该对象才能被垃圾回收。因此,在这种情况下:

List<String> list = new ArrayList<String>();

Map<String, List<String>> map = new HashMap<String, List<String>>();

map.put("Foo", list);

list = null;

…该ArrayList对象仍然不能被垃圾回收,因为的对象Map有一个引用它的条目。

以上是 清除Java中的对象或将其设置为null 的全部内容, 来源链接: utcz.com/qa/423422.html

回到顶部