@LinkedList实现原理
流程分析:程序从main函数开始执行,首先执行LinkedList linkedList = new LinkedList();即实例化LinkedList对象(在堆空间中开辟一个空间,对象包括三个成员变量:size结点个数初始值0,first首结点初始值null,last尾结点初始值null),栈中的linkedList为对象引用指向堆中0x1101对象。然后执行linkedList.add(12)(此处add调用LinkedList类中的linkedLast方法,为便于理解此处用红笔改为add);当跳转到红色add方法后,首先执行final Node l = last; 把last结点对象赋值给l结点,此时为null,所以栈中l:null。然后执行final Node newNode = new Node<>(l, e, null);创建新结点设地址值为0x2202,对象中前驱为l即null,e为数据即12,后继为null,对象引用newNode为0x2202,引用存于栈中(newNode:0x2202)。然后执行last = newNode;把新结点地址赋值给尾结点last(null变为0x2202)。然后执行判断语句,由于l:null所以执行first = newNode;把新结点地址赋值给first首结点(null变为0x2202)。然后执行size++结点个数加一(由0到1)。然后执行modCount++(修改次数加一),至此一个add方法执行完成。后面的add方法同理,为了对比继续分析下一个add方法,linkedList.add(34);原来的方法linkedList.add(12)执行完释放。首先调用红笔add方法,把last结点(0x2202)赋值给l,然后把l和e(34)作为实例化参数完成实例化(地址为0x3202),引用newNode执行此对象。然后执行last = newNode;把新结点地址赋值给尾结点(0x2202变为0x3202)。然后执行判断语句,由于l非null所以执行l.next = newNode;l为指向0x2202的结点,所以此语句执行后02xx20结点的next域中的null变为0x3202(newNode)。然后执行size++结点个数加一(由1到2)。然后执行modCount++(修改次数加一),此时第二个add方法执行完毕,然后在栈中释放,其他add方法亦是如此。
流程总结:后一个结点的前驱执行前一个结点,前一个结点后继指向后一个结点,表现为双向。这就是LinkedList底层是采用双向链表实现结论的由来。在分析过程中要注意对象的地址是什么,前驱的地址是什么,后继的地址是什么,以及每步操作会对堆和栈产生怎样的影响。
第一次写有很多不足望大家多多指正。