从Vector中删除对象后应该明确删除它吗?

时间:2015-11-16 14:44:17

标签: java garbage-collection

假设我有一个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;

3 个答案:

答案 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时,垃圾收集器可以自动释放对象的内存。通常你不必考虑它,除了:

  • 某些对象包含除内存以外的外部资源。必须通过java.io.Closeable界面明确处理这些内容。
  • 如果变量超出其引用的对象的使用寿命,则可能发生无意的对象保留。在这些情况下,将对象设置为null可能很有用。但这些都是例外。
  

"取消对象引用应该是例外而不是标准。消除过时引用的最佳方法是让包含引用的变量超出范围。如果您在尽可能窄的范围内定义每个变量,这自然会发生。" - 来自" 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是你的场景的存储,那么你可以从收集中删除它,垃圾收集器从内存中删除它及其子元素。 汇总的情况

如果场景存储在某个其他存储中,并且向量用于将您的场景与其他一些信息关联(但场景存储在某个其他实体下),则从向量中移除意味着仅删除场景与某些信息之间的关联。然后场景将保留在您所有状态的系统中。 是作文的情况