集合继承结构总揽
构造方法
`linkedList(Collection<? extends E> c)` 批量添加集合内容到linkedList的构造方法`linkedList()`无参构造方法 ![linkedList linkedList = new linkedList()|aliain|center[](https://img-blog.csdnimg.cn/img_convert/5b0c3683c47d22229474b0fb6e01cdf7.png)](https://www.yuque.com/docs/share/86676521-3769-466c-8871-d38fc35f23f0?#%20%E3%80%8AlinkedList%E3%80%8B)继承自Iterable的方法
Iterator iterator() 获取迭代器 继承自Collection的方法
`add(E element)` 在集合尾部插入元素,几乎等价于linkLast(E element)`addAll(Collection<? extends E> c)` 批量添加集合元素到当前集合中`contains(Object o)` 判断集合是否包含某个元素 继承自List的方法
`set(int index, E element)` 修改元素值,同时返回原先存储的Node节点元素值`add(int index, E element)` 查找并且插入相应的元素值`addAll(int index, Collection<? extends E> c)` 批量添加集合元素到制定下标之后当前集合中(重载)`indexOf(Object o)` 获取某个元素在集合结构中的下标`listIterator()` 获取List类型的可迭代对象`listIterator(final int index)` 获取集合中某个下标值之后的List类型的可迭代对象`get(int index)` 获取当前集合中某个下标节点存储的值`remove(int index)` 删除当前集合中某个下标节点存储的值 继承自Queque的方法
`poll()` 获取并且删除集合的第一个元素`offer(E e)` 在集合尾部插入元素 继承自Deque的方法
`descendingIterator()` 获取一个可以逆序迭代的迭代器`addFirst(E element)` 在集合头部插入元素`addLast(E element)` 在集合尾部插入元素`pollFirst()` 获取并且删除集合的第一个元素`pollLast()` 获取并且删除集合的最后一个元素`peekFirst()` 获取集合的第一个元素`peekLast()` 获取集合的最后一个元素`offerFirst(E e)` 在集合头部插入元素`offerLast(E e)` 在集合尾部插入元素 其他私有方法(下标范围判断)
`checkPositionIndex(int index)` 确认当前传入的下标是否为可迭代的,否则抛出异常`isPositionIndex(int index)` 判断当前传入的下标是否为可迭代的`checkElementIndex(int index)` 确认当前传入的下标是否为越界,否则抛出异常`isElementIndex(int index)` 判断当前传入的下标是否为越界 其他私有方法(元素遍历)
`node(int index)` 根据下标来迭代获取响应的元素 其他私有方法(元素增删)
`linkFirst(E element)` 在集合头部插入元素`linkLast(E element)` 在集合尾部插入元素`linkBefore(E e, Node succ)` 在集合某个Node节点之前插入元素`unlinkFirst(E element)` 删除集合头结点`unlinkLast(Node l)` 删除集合尾节点`unlink(Node x)` 在集合中某个Node节点的值
集合继承结构总揽
兼具List的有序性和Deque的队列的特性,这个集合平常项目中使用的比较少,接着刷题的机会了解到这个数据集合,趁机来深度学习下源码知识,希望对大家可以有所帮助
public class linkedList
public linkedList(Collection<? extends E> c) { this(); addAll(c);}
linkedList()无参构造方法//无参构造方法,初始化集合对象,此时初始化以后的是一个空的集合size=0public linkedList() {}
![linkedList linkedList = new linkedList()|aliain|center](https://img-blog.csdnimg.cn/img_convert/5b0c3683c47d22229474b0fb6e01cdf7.png) 继承自Iterable的方法 Iterator iterator() 获取迭代器public Iterator
//默认在链表尾部插入数据public boolean add(E element) { linkLast(e); return true;}
addAll(Collection<? extends E> c) 批量添加集合元素到当前集合中public boolean addAll(Collection<? extends E> c) { //默认将元素添加到当前集合的末尾,调用addALL方法时index参数设置为当前集合的size属性 //调用List子集实现的方法 return addAll(size, c);}
contains(Object o) 判断集合是否包含某个元素public boolean contains(Object o) { //调用List子集实现的方法 return indexOf(o) != -1;}
继承自List的方法 set(int index, E element) 修改元素值,同时返回原先存储的Node节点元素值
//使用无参构造方法实例化linkedList后立即调用set(int index, E element)或者操作会抛出下标越界的异常IndexOutOfBoundsException,这时通不过checkPositionIndex方法的校验,因为Node节点first和last都还未实例化//该方法不改变集合结构,不对修改集合长度。设置前提是当前Node节点已经存在,public E set(int index, E element) { //判断下标是否越界 checkElementIndex(index); //循环遍历获取到响应的Node节点 Node
//使用无参构造方法实例化linkedList后立即调用add(int index, E element)操作会抛出下标越界的异常IndexOutOfBoundsException,这时通不过checkPositionIndex方法的校验,因为Node节点first和last都还未实例化public E add(int index, E element) { checkPositionIndex(index); if (index == size) linkLast(element); else linkBefore(element, node(index));}
addAll(int index, Collection<? extends E> c) 批量添加集合元素到制定下标之后当前集合中(重载)public boolean addAll(int index, Collection<? extends E> c) { checkPositionIndex(index); //Collection的子集都必须实现的方法toArray() Object[] a = c.toArray(); //待添加集合的长度 int numNew = a.length; //待添加集合为空,方法终止 if (numNew == 0) return false; //定义当前待插入数据的最前置Node节点pred //和 Node
public int indexOf(Object o) { int index = 0; if (o == null) { //待判断元素为null,从first开始通过链表往后顺序到第一个空元素并且返回下标 for (Node
public ListIterator
public ListIterator
public E get(int index) { //判断下标是否越界 checkElementIndex(index); //通过node方法遍历找到传入index对应的Node,并且获取其item值 return node(index).item;}
remove(int index) 删除当前集合中某个下标节点存储的值public E remove(int index) { //判断下标是否越界 checkElementIndex(index); //通过node方法遍历找到传入index对应的Node,然后通过unlink方法删除元素值 return unlink(node(index));}
继承自Queque的方法 poll() 获取并且删除集合的第一个元素
//实现上和pollFirst()一模一样public E poll() { final Node
public boolean offer(E e) { return add(e);}
_
继承自Deque的方法 descendingIterator() 获取一个可以逆序迭代的迭代器
public Iterator
public void addFirst(E e) { linkFirst(e);}
addLast(E element) 在集合尾部插入元素public void addLast(E e) { linkLast(e);}
pollFirst() 获取并且删除集合的第一个元素public E pollFirst() { final Node
public E pollLast() { final Node
public E peekFirst() { final Node
public E peekLast() { final Node
public boolean offerFirst(E e) { addFirst(e); return true;}
offerLast(E e) 在集合尾部插入元素public boolean offerLast(E e) { addLast(e); return true;}
其他私有方法(下标范围判断) checkPositionIndex(int index) 确认当前传入的下标是否为可迭代的,否则抛出异常
private void checkPositionIndex(int index) { if (!isPositionIndex(index)) throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}
isPositionIndex(int index) 判断当前传入的下标是否为可迭代的判断当前传入的下表是否为可迭代的, 可选范围是0<= index <= size 在链表的迭代器(Iterator)里,双向Queue(Deque)中可以正向、反向的迭代,所以index的可选范围对比数组是要大一点
private boolean isPositionIndex(int index) { return index >= 0 && index <= size;}
checkElementIndex(int index) 确认当前传入的下标是否为越界,否则抛出异常private void checkElementIndex(int index) { if (!isElementIndex(index)) throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}
isElementIndex(int index) 判断当前传入的下标是否为越界private boolean isElementIndex(int index) { return index >= 0 && index < size;}
其他私有方法(元素遍历) node(int index) 根据下标来迭代获取响应的元素Node
private void linkFirst(E e) { final Node
void linkLast(E e) { final Node
void linkBefore(E e, Node
//该方法仅有两处被调用的地方,分别是pollFirst()和poll(),都是需要拿到集合的头节点并且删除头节点的操作private E unlinkFirst(Node
//代码逻辑和unlinkFirst类似,只是需要逆向处理private E unlinkLast(Node
//简单的说就是剪短旧链 让x.pref.next=x.next x.next.pref=x.prefE unlink(Node