如何删除对象?

时间:2012-03-27 15:08:23

标签: java

我有两个班级:

Class Node {
int address
}
Class Link{
  int latency;
  int bandwidth;
  Node node1;
  Node node2;
  }
public Link [] link= new Link[Nmax];     

如果我想在两个节点之间创建一个链接,那很简单,我只想:

node1=new Node(); //and then I add parameter like address and so on
node2= new Node();//...............
link[1]= new Link();
link[1].node1=node1;
link[1].node2=node2;
link[1].latency=15; //and so on, we suppose that we have 100 nodes and 60 links

现在,在程序期间,有时我们添加一些新节点然后我们必须在它们之间添加链接,我可以用上面相同的方式做到这一点,我的问题是:  如果我想删除节点,我该怎么办? (此节点与其他现有节点之间的链接也必须删除)

4 个答案:

答案 0 :(得分:2)

---为了回应jpm的出色观察而编辑---

在您的情况下,您自己正在进行所有数据结构管理,但是没有存储足够的信息来撤消对数据结构的添加。

您需要在创建时存储足够的信息以支持数据结构上的其他操作。这意味着可能选择数组作为高级公开数据结构是一个糟糕的选择,因为无法保证添加将保留足够的信息来支持删除。

将数组包装在对象中,并使用add(...)方法编写代码以支持有效删除。这可能意味着存储更多信息,这些信息是专门为支持删除而构建的。

---原帖如下---

要删除Java中的对象,请确保没有任何“指向”它(具有对它的引用)然后等待。自动垃圾收集将为您进行删除。

一个明确的例子

 link[1] = new Link();
 // now we have an extra Link in our array
 link[1] = null;
 // now garbage collection will delete the recently added Link object.

请注意,如果您对创建的Link对象有两个或三个引用,则在所有引用都丢失之前不会收集它

 link[1] = new Link();
 // now we have an extra Link in our array
 Link current = link[1];
 // now we have two references to the newly created Link
 link[1] = null;
 // now we have one reference to the newly created Link
 current = null;
 // now the newly created Link is a candidate for garbage collection

实现此方法的方法是用户实现的程序的顶级Thread。如果该线程可以到达有问题的Object那么它将不会被垃圾收集。这意味着无法再从实时Object访问的Thread s的环和网格将被大量收集。

答案 1 :(得分:1)

删除节点之前;循环链接并删除任何将节点作为node1或node2删除的节点,然后删除节点。

答案 2 :(得分:1)

对于此用例,您可能希望探索使用比数组更好的数据结构。您希望能够检查所有链接,找出哪些链接引用已删除的节点,并删除这些链接。开始查看List / Set并查看它们是否符合您的需求,然后慢慢演变成一个能够满足您需求的良好实现。

答案 3 :(得分:0)

“删除”Java中的对象意味着删除指向该对象的所有引用。然后垃圾收集器最终将释放该对象占用的内存。因此,您需要做的是将对特定Node对象的所有引用设置为null

// lets delete node1
link[1].node1 = null;
node1 = null;

// at some point the object will be deleted