Java 链表-单个对象如何一个接一个地存储这么多地址?

Java 链表-单个对象如何一个接一个地存储这么多地址?,java,data-structures,linked-list,Java,Data Structures,Linked List,我了解数据结构和链表,但我不懂一些东西。单个对象如何存储如此多的地址和数据。当我了解对象时,我发现如果要为单个变量存储多个数据,就需要创建新对象,但现在在链表中,newNode对象将存储data1、next1、data2、next2等,。。。。达坦,下一个 当程序运行list.insert(11)且数据变为11时,为什么不删除5的旧数据 对不起,我的英语语法,任何反馈都将不胜感激。谢谢大家! 以下代码是关于在链接列表中插入节点的代码: 节点类: public class Node {

我了解数据结构和链表,但我不懂一些东西。单个对象如何存储如此多的地址和数据。当我了解对象时,我发现如果要为单个变量存储多个数据,就需要创建新对象,但现在在链表中,newNode对象将存储data1、next1、data2、next2等,。。。。达坦,下一个

当程序运行list.insert(11)且数据变为11时,为什么不删除5的旧数据

对不起,我的英语语法,任何反馈都将不胜感激。谢谢大家!

以下代码是关于在链接列表中插入节点的代码:

节点类

public class Node {

    int data;
    Node next;

    public int getData() {

        return data;
    }

    public Node getNext() {

        return next;
    }

    public void setData(int data) {

        this.data = data;
    }

    public void setNext(Node next) {

        this.next = next;
    }

}
MyLinkedList类:

public class MyLinkedList {

    Node head;

    public void insert(int data) {

        Node newNode = new Node();
        newNode.setData(data); 
        newNode.setNext(null);

        if (head == null) {

            head = newNode;
        }
        else {

            Node n = head;
            while(n.getNext() != null) {

                n = n.getNext();
            }

            n.setNext(newNode);
        }
    }

    public void show() {

        Node newNode = head;
        while (newNode.getNext() != null) {

            System.out.println(newNode.getData());
            newNode = newNode.getNext();
        }

        System.out.println(newNode.getData());
    }

}
public class Runner {

    public static void main(String args[]) {

        MyLinkedList list = new MyLinkedList();

        list.insert(5);
        list.insert(11);
        list.insert(9);
        list.insert(3);
        list.show();
    }

}
Runnner类:

public class MyLinkedList {

    Node head;

    public void insert(int data) {

        Node newNode = new Node();
        newNode.setData(data); 
        newNode.setNext(null);

        if (head == null) {

            head = newNode;
        }
        else {

            Node n = head;
            while(n.getNext() != null) {

                n = n.getNext();
            }

            n.setNext(newNode);
        }
    }

    public void show() {

        Node newNode = head;
        while (newNode.getNext() != null) {

            System.out.println(newNode.getData());
            newNode = newNode.getNext();
        }

        System.out.println(newNode.getData());
    }

}
public class Runner {

    public static void main(String args[]) {

        MyLinkedList list = new MyLinkedList();

        list.insert(5);
        list.insert(11);
        list.insert(9);
        list.insert(3);
        list.show();
    }

}

链表本身几乎不知道它所包含的数据。它通常只保存总大小的变量和对第一个节点头的引用(在双链接列表中也是对尾部的引用)

节点是一个自有对象,它包含一个数据变量和对下一个节点的引用,该节点也是自有对象,依此类推。(在双链接列表中,节点也具有指向上一个节点的指针)

因此,为了访问第五个节点,您需要从头部开始,按照下一个指针到达第五个节点。链接列表中没有直接访问权限。但是,它允许通过重新安排节点的下一个指针(例如跳过节点)轻松插入或删除元素

另外,请注意,一个对象可以保存的数据量没有限制。您完全可以在一个对象中同时保存所有数据。此外,对象的变量只是对实际数据存储位置的引用。因此,它不需要在内存中彼此相邻,它可以分散在各地

相反,数组的所有数据都连接在内存中。这就是为什么直接访问可以很好地与阵列配合使用。您有数组开始的基址,知道元素的字节大小,并且可以轻松地计算元素开始的内存数据中的位置:

// Memory address of fifth element of an int[] array
base + 4 * sizeof(int)

这也是它们需要具有固定大小的原因。

否。节点包含单个数据元素。但它有一个对另一个节点的引用,该节点包含另一个数据元素,并且也有对另一个节点的引用。“猫王”指的是你,而且只指你。但如果我问你“谁是你的父亲”,你就可以告诉我“老猫王”。然后我可以问老猫王“谁是你的父亲”,他会回答“约翰·巴尔”,等等。“猫王”是一个人,但通过这个人,通过反复询问父亲(或母亲,或邻居等),我可以接触到许多其他人。谢谢你的解释!在创建新节点时,旧节点不是被删除了吗?我认为有一个单独的对象存储数据1,next1,然后当创建数据2,next2时,旧的数据1,next1被删除。当创建对象Node3时,对象Node2没有被删除(通过Grbage集合),因为Node1指向它。我理解正确吗?每个数据项都有一个节点对象。
LinkedList
对象的唯一用途是保存对第一个节点对象和元数据的引用。删除节点只需跳过即可隐式工作(请参见图)。垃圾收集器将最终删除跳过的节点,因为没有人再引用它。垃圾收集器只删除不再引用的对象。因此,只要每个节点都被某个对象引用,它们就不会被删除。