1

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

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

有时我想在给定的 P 处刷新 X。这很简单——从表中调用点 P 并直接操作数组。

现在说那些 X 是 Y 的一部分 - 准确地说是 Y 的片段。假设给定的 Y 消失了。现在,如果 Y 消失,所有与它相连的 X 也应该消失,对吧?

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

  1. 它们是数组的一部分,所以另一个 Y 的 X 也可能在那里,所以我们只需要删除属于给定 Y 的 X。
  2. 我们可以搜索属于 Y 的 X 的哈希表结构——例如,我们可以找出 Y 将占据的所有点 P,然后拉出这些容器并删除所有附加到 Y 的 X。
  3. 我们可以直接删除它们吗?如果 Y 有其 X 的列表,是否可以通过引用将它们删除,而无需通过搜索表的工作?

这实际上是关于整个引用的一般性问题。在其他情况下,存在对一个对象的多个引用,我希望能够快速删除该对象,而无需在其他位置导航到它。

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

4

1 回答 1

1

在 Java 中,这个问题通常通过WeakReference<T>对象来解决:如果您不希望引用来阻止对象X被收集,请将其设置为:当不再从其他任何地方强烈引用WeakReference<X>时,Java 会将其清空。X

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

于 2012-05-25T16:17:20.967 回答