linkedlist是一个双向链表结构(像咬着自己尾巴的蛇)。
心得:对链表的理解、位移的操作进一步加深
特点:查找数据时只能按顺序来查询(remove方法中使用了位移>>1一位来判断从头遍历还是尾遍历)
欢迎补充和纠错,3Q
主要是操作内部类new的一个对象header
private transient Entry<E> header = new Entry<E>(null, null, null);
这个内部类Entry<E>中有三个字段
E element;
Entry<E> next;
Entry<E> previous;
header是蛇头,element是值,
next像蛇身(一直延续到蛇尾-蛇头形成一个循环),
previous像蛇尾(一直延续到蛇身-蛇头形成一个循环)
addBefore 添加一个新元素
(创建一个新的Entry<E>并指定上一个元素的下一个指向他的下一个元素和下一个元素的上一个指向他的上一个元素(
e.previous.next = e.next; e.next.previous = e.previous;)
,就是为这个新创建的entry定义一个位置)
remove(Entry<E> e) 将这个e的next和previous都置为空,并维护他的上一个位置与下一个位置的关系
remove(Object) remove(index)方法最后都是调用remove(Entry<E> e)
remove(Object) 如果object 为null则选出第一个element为null的元素移除
entry(int index) 这个方法在遍历中会用到(获取只能位置的Entry元素)许多方法都会调用到他(remove,set,get)
clear() 初始化链表,从头部循环到尾部,将每一个entry的next、previous、element置为空最后初始化header
toArray()内部创建了一个object[]并循环为他赋值
toArray(T[] a)这个方法如果a的length小于链表的长度会重新new一个链表长度的a,两个方法是差不多的。
注释也有说明如果toArray(new Object[])是等同于toArray()
我认为核心的和常用的方法就是这几个,其他的方法无非就是调用到了以上的方法
由于时间关系写的不是太详细,大致就这些了。