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

前篇博文讲到了Java底层怎么知道ArrayList和LinkedList哪个是随机访问哪个是顺序访问的,本片博文主要介绍各自的数据特点。
ArrayList:
在这里插入图片描述从他的这个构造函数我们可以知道他的底层实现就是一个Object对象数组。
在这里插入图片描述第二个构造函数构造一个空的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()方法
在这里插入图片描述
如果说元数组的容量大小在没有改变的情况下,那么很简单的返回最大的容量值,否则返回当前需要的最小长度。我们再看方法:
在这里插入图片描述
当前要求的最小长度减去元数组当前的长度大于0,说明当前添加元素被要求要扩容元数组长度。进一步追踪grow()方法。
在这里插入图片描述先是将数组长度扩大到原来的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() 添加到末尾(尾插)。
前向“指针”为尾节点,后项“指针”为空在这里插入图片描述该方法比较简单直接是将元素添加到最后,他这里先得到一恶last节点l,然后构造一个带元素e的节点newNode,最后插入newNode,size++。
2、其实还包含了头插法:
在这里插入图片描述
final Node newNode = new Node<>(null, e, f);前向“指针”为空,后向“指针”为头节点。
3、插入到某个非空节点(元素为e)的节点之前。
在这里插入图片描述4、remove头节点
在这里插入图片描述5、remove尾节点
在这里插入图片描述6、remove任意节点X
在这里插入图片描述
根据以上的几个方法我们基本可以敲定linkedlist这种数据结构。
如有不正确之处,恳请指正,谢谢。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值