List

  • List集合概述
  • List集合特点
  • List特有的方法
  • ArrayList
  • 源码解析
  • LinkedList
  • LinkedList源码解析


List集合概述
  • 有序集合,这里的有序指的是存放顺序
  • 用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素
  • 与Set集合不同,列表通常允许重复的元素
List集合特点
  • 有序:存储和取出的元素顺序一致
  • 有索引:可以通过索引操作元素
  • 可重复:存储的元素可以重复
List特有的方法

java lambda 双层list 扁平化 javalist底层_学习

ArrayList
  • ArrayList :底层数据结构是数组,查询快,增删慢。
源码解析

底层实现:当我们利用空参构造创建了一个ArrayList对象时,它在底层先创建了一个长度为0的数组,当我们用add()方法添加第一个数据时,它会创建一个新的长度为10的数组,里面默认初始化值都为NULL,所以我们一般默认认为ArrayList底层的数组默认长度为10,这个数组在底层的名字叫做elementData.

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

java lambda 双层list 扁平化 javalist底层_List_02

并且ArrayList底层还有一个变量size(注意!是变量),默认指向0索引,这个变量有两层含义:①表示下一次要操作的索引,②表示当前数组中元素的个数。当size达到10时,集合会自动扩容1.5倍(新数组长度15),然后将元素拷贝到新数组。

java lambda 双层list 扁平化 javalist底层_List_03


查询: list.get(int index)如果获取的索引大于等于size,将会报错

遍历:

for(int i = 0; i < list.size(); i++){
	String s = list.get(i);
	System.out.println(s);
}
LinkedList
  • LinkedList:底层数据结构是链表,查询慢,增删快。

LinkedList集合的特有功能

java lambda 双层list 扁平化 javalist底层_学习_04

LinkedList源码解析

底层实现:

LinkedList底层是一个双向链表

java lambda 双层list 扁平化 javalist底层_List_05


它的每一个节点有三个值 itme存储本结点应该存储的值,next存储下一个结点的地址值,prev存储上一个结点的地址值

java lambda 双层list 扁平化 javalist底层_java_06


当我们 new LinkedList<>() 时,相当于在堆内存中开辟了一块小空间,开辟完空间之后,LinkedList会维护两个变量 Node first(头结点)和 Node last(最后一个结点)。

当我们利用add() 方法添加元素时,add() 方法会将元素传递给 linkedLast() 方法,linkedList()方法里面会利用 Node newNode = new Node<>(l, e, null) 在堆内存里面开辟新的小空间创建一个新结点

此处存的就是e的值,而下一个结点的地址值又变成了null。

java lambda 双层list 扁平化 javalist底层_学习_07


添加第二个元素

java lambda 双层list 扁平化 javalist底层_List_08


后面的元素类似

java lambda 双层list 扁平化 javalist底层_List_09