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