当前位置: 首页 > 知识库问答 >
问题:

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

谢旻
2023-03-14
    null

在这种情况下,如果我调用list=null;list.clear();,对象会发生什么?在哪种情况下,对象丢失了,在哪种情况下,只有引用被设置为NULL?

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

共有1个答案

公良文彬
2023-03-14

首先,您永远不会将对象设置为NULL。那个概念没有任何意义。可以将null值赋给变量,但需要非常仔细地区分“variable”和“object”的概念。一旦你这样做了,你的问题就会回答:)

现在就“浅复制”与“深复制”而言--这里可能值得避免术语“浅复制”,因为通常浅复制涉及创建一个新对象,但只是直接复制现有对象的字段。深度副本还将获取这些字段引用的对象的副本(对于引用类型字段)。下面是一个简单的作业:

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

...在这个意义上既不做浅拷贝也不做深拷贝。它只是复制引用。在上面的代码之后,list1list2都是自变量--它们现在恰好具有相同的值(引用)。我们可以改变其中一个的值,而不会影响另一个:

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;
 类似资料:
  • 问题内容: 我最近正在研究释放Java对象占用的内存。这样做的时候,我对如何在Java中复制对象(浅/深)以及如何避免在使用中意外清除/无效化对象感到困惑。 请考虑以下情形: 将a 作为参数传递给方法。 将a传递给要由线程处理的可运行类。 将放入。 现在,在这些情况下,如果我调用或,对象将如何处理?在哪种情况下丢失对象,在哪种情况下仅将引用设置为null? 我想这与对象的浅层复制和深层复制有关,但

  • 问题内容: 我用Java 创建了一个对象。当我这样做时,它显示如下:。结果,我的Excel文件似乎减少了一天(27 feb变为26 feb,依此类推),我认为这一定是因为时间的缘故。如何将其设置为下午5:30? 问题答案: 另请参阅 乔达时间 日历文件

  • 我有两个函数,递增速度和递减速度。它们都使用clearInterval()然后使用setInterval,但是有些地方不正确。 降低速度将我的速度从1000降到5000,但是如果我使用该功能,速度将增加10-20倍,看起来更像是100-500毫秒。另外,如果我使用increaseSpeed将速度提高到50毫秒,然后使用decreaseSpeed,decreaseSpeed将不会有任何效果。 这是设

  • 考虑类家长: 和类儿童: 如果我在应用程序中创建一个新的子对象,并将其放入父对象的children字段中,然后持久化父对象,为什么Hibernate不自动更新子对象的Parent字段(以便设置parentID列)?

  • 如果我这样做会发生什么: 它是从内存中删除对象,还是只清除引用? 更正式地说,考虑守则: 为什么仍然不是?它不应该被从记忆中删除吗?

  • 问题内容: 我有两个线程, 如果jvm首先执行thread1并将obj1设置为null,那么thread2会立即看到该更改,还是会花费一些时间,并且由于obj1还不为null,jvm仍可以运行thread2同步块吗? 问题答案: 这几乎肯定会破坏同步抽象- 我不敢相信会立即看到更改。您永远都不应更改要同步的对象的引用,更不要将其设置为,这将导致任何进一步尝试对其进行同步的尝试。