假设我有一个Vector v
,其中包含100个类Scenario
的对象,它由10种不同类型的对象组成。为了永久删除Scenario
及其所有对象的索引Vector v中的5,其中一个是正确的方法。
1. v.removeElementAt(5);
OR:
2. Scenario s=(Scenario) v.elementAt(5);
v.removeElementAt(5);
s=null;
OR:
3. Scenario s=(Scenario) v.elementAt(5);
s.makeAllObjectsNull();//explicitly assign null to 10 objects inside Scenario e.g. object1=null object2=null and so on
v.removeElementAt(5);
s=null;
答案 0 :(得分:3)
从Vector中删除对象后是否需要显式删除? 简单来说,所有没有来自另一个对象的引用的对象都清晰可见
GC
。
因此,如果您的代码遇到这种情况,那么该对象将为GC
。
例如,如果Scenario对象仅具有该向量的引用,则:
v.removeElementAt(5);
唯一的参考已经消失,GC
将是清晰的。
另一件要讲的是这里。 当你这样做时:
Scenario s = (Scenario) v.elementAt(5);
v.removeElementAt(5);
s = null;
您刚刚宣布了另一个引用s
,然后将其设置为null
,因此没有必要这样做。
答案 1 :(得分:3)
您永远不会在Java中显式删除对象。当垃圾收集器不再是reachable时,垃圾收集器可以自动释放对象的内存。通常你不必考虑它,除了:
"取消对象引用应该是例外而不是标准。消除过时引用的最佳方法是让包含引用的变量超出范围。如果您在尽可能窄的范围内定义每个变量,这自然会发生。" - 来自" Effective Java,"第二版,Joshua Bloch。
让我们说我有一个Vector v,其中包含100个Scenario类对象,它由10种不同类型的对象组成。
请注意,矢量不包含对象。它包含对象的引用。可能存在对相同对象的其他引用。
1
v.removeElementAt(5);
这会从向量中删除引用到对象。如果没有其他参考对象,则该对象有资格进行收集。
OR
Scenario s=(Scenario) v.elementAt(5); v.removeElementAt(5); s=null;
这没有任何价值。它会分配一个额外的参考,并立即忘记该参考。将单个引用设置为null不会导致对象处理。当且仅当没有其他外部参考时,该对象才有资格处置。
OR
Scenario s=(Scenario) v.elementAt(5); s.makeAllObjectsNull();//explicitly assign null to 10 objects inside Scenario e.g. object1=null object2=null and so on v.removeElementAt(5); s=null;
这也是不必要的。
您在Scenario对象中没有任何对象。您可能有引用到对象。垃圾收集器正在寻找无法访问的对象。它可以处理参考文献的断开连接图。
如果方案本身无法访问,则将其字段设置为null不会影响其字段引用的对象的可访问性。
答案 2 :(得分:2)
这取决于你的情况。
如果你在场景对象上没有更多的链接,而vector是你的场景的存储,那么你可以从收集中删除它,垃圾收集器从内存中删除它及其子元素。 汇总的情况
如果场景存储在某个其他存储中,并且向量用于将您的场景与其他一些信息关联(但场景存储在某个其他实体下),则从向量中移除意味着仅删除场景与某些信息之间的关联。然后场景将保留在您所有状态的系统中。 是作文的情况