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