ArrayList和Linklist解析(清晰易懂)

1.ArrayList

ArrayList 底层就是⼀个 Object[] 数组

ArrayList底层数组默认初始化容量为 10

1、jdk1.8 中ArrayList 底层先创建一个长度为0的数组
2、当第一次添加元素 (调用 add0方法) 时,会初始化为一个长度为 10 的数组

当ArrayList中的容量使用完之后,则需要对容量进行扩容:
1、ArrayList 容量使用完后,会”自动”创建容量更大的数组,并将原数组中所有元素拷贝过去,这会导致效率降低2、优化:可以使用构造方法 ArrayList(int capacity)或 ensureCapacity(int capacity) 提供一个初始化容量,避免刚开始就一直扩容,造成效率较低

ArrayList构造方法:
1.ArrayList0):创建一个初始化容量为 10的空列表

2.ArrayListintinitialCapacity): 创建一个指定初始化容量为 initialCapacity 的空列表

3.ArrayList(Collection<?extends E> c): 创建一个包含指定集合中所有元素的列表

ArrayList 特点:
优点:
1.向ArrayList 未尾添加元素 (add() 方法) 时,效率较高
2.查询效率高
缺点:
1,扩容会造成效率较低(可以通过指定初始化容量,在一定程度上对其进行改善)2.另外数组无法存储大数据量(因为很难找到一块很大的连续的内存空间)3.向ArrayList 中间添加元素 (add(intindex)) ,需要移动元素,效率较低1.但是,向ArrayList 中国位置增/删元素的情况较少时不影响;2.如果增/删操作较多,可考虑改用链表。

2.Linklist

LinkedList 特点
数据结构: LinkedList 底层是一个双向链表

优点:增/删效率高

缺点:查询效率较低
LinkedList 也有下标,但是内存不一定是连续的(类似C++重载符号,将循位置访问模拟为循秩访问)LinkedList 可以调用 get(int index) 方法,返链表中第 index 个元素。

但是,每次查找都要从头结点开始遍历

add()方法源码解读

public cTass LinkedList<E> extendsimpTements...{
    transient int size = 0; // 链表长度
    transient Node<E> first; // 指向链表第一个节点
    transient Node<E> ast; // 指向链表最后一个节点
	public boolean add(E e) { // 添加元素
    	linkLast(e); // 向链表末尾添加元素e
   		return true;
}
void TinkLast(E e) { // 向链表未尾添加元素 
    efina1 Node<E> 1 = ast; // 暂时保存最后一个元素的指针
    fina1 Node<E> newNode = new Node<>(1, e, nu11);
    Tast = newNode; // newNode 作为最后一个节点
    if (1 == nu11) // 当前链表为空
		first = newNode; // 第一个添加的节点,即为 first
    else // 链表不空
		1.next = newNode; // 当前链表的最后一个节点next 指向newNodesize++;
		modCount++;
}
// LinkedList 底层是一个双向链表
    private static class Node<E> { // LinkedList 的节点静态内部类 Node
		E item;
		Node<E> next; // 后继
		Node<E> prev; // 前驱
        
		Node(Node<E> prev,E element, Node<E> next) {
           	this ,item = element;
			this .next = next;
			this.prev = prev;
       }

Listlterator 接口
1、LinkedListadd 方法只能将数据添加到链表的未尾

2、如果要将对象添加到链表的中间位置

则需要使用 Listlterator 接口的add 方法

​ 1.Listlterator 是 lterator 的一个子接口

3、Iterator中remove 方法
1.调用 next 之后,remove 方法删除的是迭代器左侧的元素 (类似键盘的 backspace

​ 2.调用 previous 之后,remove 删除的是迭代器右侧的元素
4、Listlterator 中add 方法
1.调用 next 之后,在迭代器左侧添加一个元素

​ 2.调用 previous 之后,add 是在迭代器右侧添加元素

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值