在Java中通过引用删除对象

时间:2012-05-25 16:09:21

标签: java arrays object

这是一个奇怪的问题。但是这里。

我有一个对象X,它被插入一个数组中,在一个哈希表中,在另一个对象(容器对象)中。它表示在3d空间中P点的X实例。

有时我会想要在给定的P处刷新X.这很简单 - 从表中回忆点P并直接操作数组。

现在说那些X是Y的一部分 - Y的片段是准确的。让我们说给定的Y消失了。现在,如果Y消失了所有附在它上面的X也应该消失,对吗?

准确地说,从模型中概念性地移除了对象Y.它是否实际被删除是无关紧要的(例如,它可能存储在其他地方。)但重点是,除了检查Y附近的每个点的X之外,我如何从哈希表中正确删除它们?

  1. 他们是数组的一部分,所以另外Y的X也可能存在,所以我们只需删除属于给定Y的X.
  2. 我们可以在哈希表结构中搜索属于Y的X - 例如我们可以找出Y将占据的所有点P,然后拉出这些容器并删除附加到我们的所有X.收率
  3. 我们可以直接删除吗?如果Y有一个X的列表,可以通过引用删除它们,而不必经过搜索表的努力吗?
  4. 这实际上是关于整个参考文献的一般性问题。在其他情况下,对象存在多个引用,我希望能够快速删除该对象,而无需在其他位置导航到该对象。

    这意味着当一个引用类删除对象时,该对象应该被普遍“删除”;其他列表都不应该保留对它的引用。

1 个答案:

答案 0 :(得分:1)

在Java中,WeakReference<T>个对象通常会解决此问题:如果您不希望引用阻止收集对象X,请将其设为WeakReference<X>:Java将为null当X不再被其他任何地方强烈引用时,它就会消失。

例如,您可以创建一个List<X>来保留所有活动对象,并使X的所有其他引用变弱。当一个对象从列表中删除并且它的最后一个强引用消失时,无论对它的弱引用的数量如何,它都变得可收集。明显的缺点是在解除引用每个弱引用之前需要注意空值。此时,Java会为您完成所有引用跟踪;所有你需要做的就是清除掉空的弱引用,这比搜索大量列表容易得多。