我有一个关于哈希表的小问题。假设我有一个字符串作为键,一个复杂对象作为存储在哈希表中的值。
现在我使用“get”从同一个哈希表中获取对象。现在,如果我存储从哈希表中获取的对象的引用的变量设置为 null,这不会影响哈希表中对象的内存。如何销毁哈希表中的对象?
一种方法可能是将 null 作为我给定键的值?还有其他更优雅的方式吗?
我有一个关于哈希表的小问题。假设我有一个字符串作为键,一个复杂对象作为存储在哈希表中的值。
现在我使用“get”从同一个哈希表中获取对象。现在,如果我存储从哈希表中获取的对象的引用的变量设置为 null,这不会影响哈希表中对象的内存。如何销毁哈希表中的对象?
一种方法可能是将 null 作为我给定键的值?还有其他更优雅的方式吗?
类实例 (=objects) 保留在内存中,对实例的引用存储在变量和 HashMap 值中。当没有对实例的引用时,Java VM 垃圾收集器可能会在某个时候释放内存,如果感觉如此的话。
当它所在的变量获得新值(另一个实例或 null)或超出范围时,引用就会消失。因此,如果您想删除 Map 值中的实例,您可以从 map 中删除其键,或者保留键但将值设置为 null。通常您删除,在 Map 中保留空值通常不是您想要做的事情,除非您必须这样做。如果没有其他引用,则实例有资格进行垃圾收集。
注意与 C++ 的区别:在 Java 中没有用于清理的析构函数(不保证永远调用 finalize 方法)。如果 Java 类有文件或网络连接之类的资源需要在完成时关闭,那么该类需要一个 close 方法,程序员负责显式调用它(通常在 try...finally 中阻塞,即使没有捕获),当他完成对象时。
首先,使用Map
代替Hashtable
. 其次,您可以使用该Map#remove
方法从内存中释放密钥的引用。请注意,您将从中删除键/值对,Map
但对象将一直存在,直到 GC 决定收集它。
关于Map
vs的解释Hashtable
:
请注意,两者HashMap
都是Hashtable
接口的实现Map
。