从多个位置删除Java中的对象引用

从多个位置删除Java中的对象引用,java,Java,我有一门课是这样的: Class Node { private String name; private Node next; public Node(String name) { this.name = name; } public void setNext(Node node) { this.next = node; } public Node getNext() { return this.next;

我有一门课是这样的:

Class Node {
   private String name;
   private Node next;

   public Node(String name) {
      this.name = name;
   }

   public void setNext(Node node) {
      this.next = node;
   }

   public Node getNext() {
      return this.next;
   }
}
我有一个示例节点:

Node node = new Node("abc");
Node n1 = new Node("def");

node.setNext(n1);
现在如果我这样做:

n1 = null;
node.getNext()  <--  This returns new Node("def");
n1=null;

node.getNext()如果不使用setNext设置,则无法执行此操作。为什么?? 因为node仍然具有n1的值,所以您必须将node.setNext也设置为null。。。。如果您希望从已删除的节点将所有下一个指针设置为null,那么必须循环整个过程直到结束,并将每个指针设置为null


如果需要,可以在model类中设置它,但仍然必须使用setNode,如果不通过调用setNext将next设置为null,则无法执行此操作,因为

节点=新节点(“abc”); 节点n1=新节点(“def”)

node.setNext(n1);-->现在n1和next都将指向堆中的同一个对象


n1=null;-->这将使n1指向null,但next仍将指向堆中的节点对象。

如果调用
getNext()
的频率高于
setNext(…)
(通常情况下),则可以执行以下操作:

此外,在这两种情况下,您可能希望在
invalidate
方法的末尾添加以下行:

if (node.next != null)
    invalidate(node.next);

这将有效地删除链接到通过递归调用失效的节点的整个链。

您必须跟踪对对象的引用。JVM不会这样做。你所要求的是做不到的。从理论上讲,你可以封装引用,但我不推荐。基本上没有办法做到这一点(当然不是在字段为空时),而且在我看来,这也像是错误的设计。不了解OOP是如何工作的,这也是一个X-Y问题。如果你能告诉我们你想完成什么,我们也许能提出一些建议。(正如Andreas所指出的,它“可以”通过方法调用来完成,但结果将是如此令人难以置信和邪恶,我无法想象它会是有用的或可维护的。)我正在寻找一种有效的方法来完成它。我发现在整个列表中循环效率很低。实际上,您只需设置node.setNext(null),那么这个节点将不会引用其他节点,从而防止您必须将其他节点的值设置为null,但。。。但它会创建一个无用的列表节点,占用大量内存,哈哈……你可以使用@John Mclane(杀手名称:P),并在一天结束时递归地调用它,基本上就是循环:P
private static final Map<Node, Set<Node>> backLinks = new HashMap<>();
private static final Set<Node> validNodes = new HashSet<>();
    public Node(String name) {
        this.name = name;
        validNodes.add(this);
    }

    public void setNext(Node node) {
        next = node;
    }

    public Node getNext() {
        return validNodes.contains(next) ? next : null;
    }

    // call this whenever you need to invalidate (exclude) a node
    public static void invalidate(Node node) {
        validNodes.remove(node);
    }
if (node.next != null)
    invalidate(node.next);