以此链表代码为例
public class MyLinkedList<T> {
class Node<T> {
T data;
Node<T> next;
public Node() {
}
}
Node<T> root = null;
// 单链表的CURD
// 新增
public void addNode(T data) {
Node<T> newNode = new Node<>(data);
newNode.data = data;
if (root == null) {
root = newNode;
return;
}
Node<T> temp = root;
while (temp.next != null) {
System.out.println(temp);
temp = temp.next;
}
temp.next = newNode;
}
// 遍历查询
public void forEach() {
if (root == null) {
System.out.println("链表为空!");
return;
}
Node<T> temp = root;
while (temp.next != null) {
System.out.println(temp);
temp = temp.next;
}
}
}
main方法:
public static void main(String[] args) {
MyLinkedList<Integer> list = new MyLinkedList<>();
list.forEach();
System.out.println("====");
list.addNode(1);
list.addNode(2);
list.addNode(3);
list.forEach();
System.out.println("====");
}
我们从main方法入手,一行一行代码解析
-
类加载,MyLinkedList.java经过javac和java的指令之后,进入方法区,保存自己的类加载信息,包括成员变量,成员方法
-
随后进入main方法,会在JVM的线程栈中创建main方法的栈帧
-
main方法创建了一个MyLinkedList的对象,list变量存放在栈中,new出来的对象存放在堆中
-
调用addNode方法,在栈中创建addNode方法的新栈帧,并将方法形参data,新声明的newNode,temp都压入栈中
-
newNode会在堆中创建新的Node,插入到链表的末尾;temp复制了head指针,初始指向头结点
-
方法调用结束后,addNode方法栈帧出栈,随后在堆中插入头结点,由头指针head指向这个结点,data值为1
-
如法炮制,插入剩下的结点