使用新对象更新ArrayList +删除旧对象

时间:2019-03-04 18:09:52

标签: java oop object

我仍在学习Java基础知识,并尝试在不同层次上理解该语言。我有一个关于在Java中创建/删除旧对象的问题。

我有一个例子:

假设我有laptopList = new ArrayList<Laptop>;,其中包含类Laptop的对象。我们已经创建了20个对象,所有对象都已添加到ArrayList中。现在,我们要使用新的Laptop对象更新第四个索引。在这种情况下,我们可以创建新的Laptop对象并使用laptopList.set(4, new Laptop("Dell",1024));

在这一点上,我想问你->我们将不再使用该旧实例,但它仍存在于内存中。我们应该将旧实例设置为null值(还是以其他方式将其删除)?我知道对于PC来说可能没问题,但是对移动设备有什么影响(内存使用=>更快的电池放电速度。)

我知道在Java中实现了称为Garbage Collector的工具。在这种情况下行得通吗?是否会立即删除不使用的实例?如何以及何时知道不再使用特定实例?

在此先感谢您的答复和信息。

2 个答案:

答案 0 :(得分:0)

Java的垃圾收集器将释放以前位于索引4的对象的内存,前提是可以收集该对象。如果您的代码的另一部分未引用它,则应该是可收集的。 Java将定期运行Java收集器,因此没有理由自己运行它。

Java支持垃圾回收器的许多实现,这些实现针对不同的环境进行了优化。默认的垃圾收集器通常对于大多数常规应用程序都适用。

在移动应用程序中,默认情况下,在移动设备上运行的JVM应该使用为移动环境优化的垃圾收集器。您可以在此处了解有关Java垃圾收集的更多信息:https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

答案 1 :(得分:0)

好吧,您没有机会直接用Java删除对象。

在您张贴帖子的情况下,笔记本电脑仅由ArrayList引用。一旦在第4个索引上存储了新对象,就没有剩余对该对象的引用,您已经覆盖了该对象。这样就可以删除该对象。

而且,正如您已经猜到的那样,垃圾收集器将处理这个未使用的对象。但是要回答您的答案:您将不知道何时发生这种情况。也许垃圾收集器将立即开始运行并从内存中删除该对象。很有可能垃圾回收器不会立即运行,因此对象保留在内存中。当应用程序处于空闲状态时,垃圾收集器可能会运行,但是肯定会在需要内存时运行。您可能会要求JVM运行垃圾收集器(System.gc();),但是同样,您将无法完全控制垃圾收集器。它也可能会在几毫秒后运行。

基于未删除对象的内存使用主题与编译语言有些不同。当您启动JVM(使用JVM启动应用程序)时,JVM从底层OS请求一定数量的内存(您可以在使用某些标志启动JVM的同时控制该数量),因此JVM可以自己控制内存。这意味着,内存完全在JVM的控制之下,因此,这里不再需要较少的电池使用量。