HashTable的内存参考

时间:2012-11-01 06:01:37

标签: java

我对哈希表有一个小问题。假设我有一个String作为键,一个复杂的对象作为存储在哈希表中的值。

现在我使用“get”从同一个哈希表中获取对象。现在,如果我将从哈希表中获取的对象的引用存储的变量设置为null,则这将不会影响哈希表中对象的内存。如何销毁哈希表中的对象?

一种方法可能是将null作为我给定键的值?还有另外一种更优雅的方式吗?

2 个答案:

答案 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的说明:

请注意,HashMapHashtable都是Map接口的实现。