在Java中通过引用删除对象

在Java中通过引用删除对象,java,arrays,object,Java,Arrays,Object,这是一个奇怪的问题。但事情是这样的 我有一个对象X,它被插入到一个数组中,一个哈希表中,在另一个对象(容器对象)中,它表示3d空间中点p处X的实例 有时我会想刷新给定p处的X。这很简单-从表中调用点p并直接操作数组 现在假设这些X是Y的一部分,精确地说是Y的碎片。假设一个给定的Y消失了。现在,如果Y消失了,所有与之相连的X也应该消失,对吗 准确地说,对象Y从概念上从模型中移除。它是否真的被删除并不重要(例如,它可能被存储在其他地方),但重要的一点是,除了检查Y附近的每个点的X之外,如何正确地将它

这是一个奇怪的问题。但事情是这样的

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

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

现在假设这些X是Y的一部分,精确地说是Y的碎片。假设一个给定的Y消失了。现在,如果Y消失了,所有与之相连的X也应该消失,对吗

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

  • 它们是数组的一部分,所以另一个Y的X也可能在那里,所以我们只需要删除属于给定Y的X
  • 我们可以在哈希表结构中搜索属于Y的X——例如,我们可以计算出Y将占据的所有点P,然后拉出这些容器并移除所有连接到Y的X
  • 我们可以直接移除它们吗?如果Y有一个X的列表,那么它们是否可以通过引用删除,而不必搜索表
  • 这实际上是一个关于整个参考文献的一般性问题。在其他情况下,对一个对象存在多个引用,我希望能够快速删除该对象,而不必在其他位置导航到该对象


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

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


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

    在Java中,这个问题通常通过对象来解决:如果您不希望引用阻止对象
    X
    被收集,将其设为
    WeakReference
    :当
    X
    不再从任何其他地方强烈引用时,Java将使其无效


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

    是的,尽管已经使用轮询逻辑将对象从表中拉出-即在取消引用之前进行检查。平面列表(用于绘图)和哈希列表(用于点更新)不如对象Y存储的列表强大,因为对象Y在概念上将X与世界绑定在一起。或者说,如果相关的Y不存在,那么X就没有意义了。@RiverC注意到,所有(非弱)对Y及其X的引用都需要消失,才能使
    WeakReference
    成为可收藏的。此外,它不会立即被置空——当Y不在时,X可能仍然存在——只有当GC决定进行收集时,它才会被收集。(尽管您可以在代码中显式调用GC,使其立即发生。)我可能不得不这样做。因为我们讨论的是帧到帧的更新,所以如果绘图列表包含垃圾,我们就有问题了。@C频繁的GC调用可能会使您的应用程序慢很多。我认为更好的选择是在X中保留一个标记为“死”的标志,并在显示之前检查它。通过这种方式,不必立即收集X,但您仍然知道它们是否(概念上)已被删除。是的,尽管对象已使用轮询逻辑从表中拉出-即在取消引用之前进行检查。平面列表(用于绘图)和哈希列表(用于点更新)不如对象Y存储的列表强大,因为对象Y在概念上将X与世界绑定在一起。或者说,如果相关的Y不存在,那么X就没有意义了。@RiverC注意到,所有(非弱)对Y及其X的引用都需要消失,才能使
    WeakReference
    成为可收藏的。此外,它不会立即被置空——当Y不在时,X可能仍然存在——只有当GC决定进行收集时,它才会被收集。(尽管您可以在代码中显式调用GC,使其立即发生。)我可能不得不这样做。因为我们讨论的是帧到帧的更新,所以如果绘图列表包含垃圾,我们就有问题了。@C频繁的GC调用可能会使您的应用程序慢很多。我认为更好的选择是在X中保留一个标记为“死”的标志,并在显示之前检查它。这