java数据结构之:ArrayList与LinkedList详解

前篇博文讲到了Java底层怎么知道ArrayList和LinkedList哪个是随机访问哪个是顺序访问的,本片博文主要介绍各自的数据特点。
ArrayList:
java数据结构之:ArrayList与LinkedList详解_第1张图片从他的这个构造函数我们可以知道他的底层实现就是一个Object对象数组。
java数据结构之:ArrayList与LinkedList详解_第2张图片第二个构造函数构造一个空的list默认长度为10
第三个构造函数构造一个包含特定collection集合的list
接下来看一看add方法:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
ensureCapacityInternal()方法是确保当前数据有位置添加,随后将数据添加到原元数组。我们进一步看看ensureCapacityInternal()方法
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
我们先看方法calculateCapacity()方法
java数据结构之:ArrayList与LinkedList详解_第3张图片
如果说元数组的容量大小在没有改变的情况下,那么很简单的返回最大的容量值,否则返回当前需要的最小长度。我们再看方法:
java数据结构之:ArrayList与LinkedList详解_第4张图片
当前要求的最小长度减去元数组当前的长度大于0,说明当前添加元素被要求要扩容元数组长度。进一步追踪grow()方法。
java数据结构之:ArrayList与LinkedList详解_第5张图片先是将数组长度扩大到原来的1.5倍,如果说newCapacity小于当前的最小需求长度则newCapacity等于minCapacity,下面进步一判断当扩容的大小已经超出最大范围时,那么newCapacity就为MAX_ARRAY_SIZE。最后一句话则是将元数组直接到另一个新的长度为原来1.5倍的数组中。它的底层实现是本地方法:
在这里插入图片描述由于笔者水平有限,暂不讨论这一块,有兴趣的读者可自行研读。
了解了add方法,还有一个我们常用的方法就是它的get方法,我们接着进一步追踪源码:
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
可以看到第一句为检查当前的index是否是合法的(是否超出范围),第二句则就是直接返回对应索引值下的元数值。

LinkedList
它里面内置了一个类(node)数据结构。
private static class Node {
E item;
Node next;
Node prev;
Node(Node prev, E element, Node next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
我们说linkedlist的底层结构实际是一个双向链表。从node结构我们可以看出他有前向“指针”和后向“指针”和元素。接下来我们来trace一下该结构的增删改查。
add:
public boolean add(E e) {
linkLast(e);
return true;
}
1、linkLast() 添加到末尾(尾插)。
前向“指针”为尾节点,后项“指针”为空java数据结构之:ArrayList与LinkedList详解_第6张图片该方法比较简单直接是将元素添加到最后,他这里先得到一恶last节点l,然后构造一个带元素e的节点newNode,最后插入newNode,size++。
2、其实还包含了头插法:
java数据结构之:ArrayList与LinkedList详解_第7张图片
final Node newNode = new Node<>(null, e, f);前向“指针”为空,后向“指针”为头节点。
3、插入到某个非空节点(元素为e)的节点之前。
java数据结构之:ArrayList与LinkedList详解_第8张图片4、remove头节点
java数据结构之:ArrayList与LinkedList详解_第9张图片5、remove尾节点
java数据结构之:ArrayList与LinkedList详解_第10张图片6、remove任意节点X
java数据结构之:ArrayList与LinkedList详解_第11张图片
根据以上的几个方法我们基本可以敲定linkedlist这种数据结构。
如有不正确之处,恳请指正,谢谢。

你可能感兴趣的:(Java数据结构源码分析)