文章目录
tip:以下是正文部分
一、基本介绍
List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复
List集合中的每个元素都有其对应的顺序索引,即支持索引。
List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
二、常见方法
Object set(int index, Object ele):设置指定index位置的元素为ele相当于是替换。
List subList(int fromIndex, int tolndex):返回从fromIndex到tolndex位置的子集合
左闭右开
三、ArrayList注意事项
1、ArrayList 可以加入null,并且多个
2、ArrayList 是由数组来实现数据存储的
3、ArrayList 基本等同于Vector,除了 ArrayList是线程不安全(执行效率高) ,在多线程情况下,不建议使用ArrayList
四、ArrayList底层结构
1、ArrayList中维护了一个Object类型的数组elementData.
transient Obiect[l elementData;
2、当创建对象时,如果使用的是无参构造器,则初始elementData容量为0(idk7是10)当添加元素时:否则直接添加元先判断是否需要扩容,如果需要扩容,则调用grow方法
3、当添加元素时:否则直接添加元先判断是否需要扩容,如果需要扩容,则调用grow方法,否则直接添加元素到合适位置
4、如果使用的是无参构造器,如果第一次添加,需要扩容的话,则扩容elementData为10如果需要再次扩容的话,则扩容elementData为1.5倍。
5、如果使用的是指定容量capacity的构造器则初始elementData容量为capacity
6、如果使用的是指定容量capacity的构造器如果需要扩容,则直接扩容elementData为1.5倍。
我的理解
1.在new ArrayList时,先创建了一个空的elementData数组,类型为Object
2.在添加元素时会先比较当前list的大小和elementData数组大小,判断是否需要扩容
3.如果需要扩容则,返回一个数组,并将内容copy回去。
五、ArrayList扩容机制
无参构造器
elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍。
有参构造器
如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容则直接扩容elementData为1.5倍。
六、LinkedList
介绍
1、LinkedList实现了双向链表和双端队列特点
2、可以添加任意元素(元素可以重复),包括null
3、线程不安全,没有实现同步
底层操作机制
1、LinkedList底层维护了一个双向链表.
2、LinkedList中维护了两个属性first和last分别指向 首节点和尾节点
3、每个节点(Node对象),里面又维护了prev、next、item三个属性,其中通过prev指向前一个,通过next指向后一个节点。最终实现双向链表.
4、LinkedList的元素的添加和删除,不是通过数组完成的,相对来说效率较高。
@SuppressWarnings({"all"})
public class Main {
public static void main(String[] args) {
Node node1 = new Node("a");
Node node2 = new Node("b");
Node node3 = new Node("c");
node1.next = node2;
node2.next = node3;
node3.pre = node2;
node2.pre = node1;
Node frist = node1;
Node end = node3;
//node1 node2 node3 成为双向链表
}
}
@SuppressWarnings({"all"})
class Node {
String value;
Node next, pre;
public Node(String value) {
this.value = value;
}
}
七、ArrayList 与 LinkedList
ArrayList
底层结构 : 可变数组
增删效率较低
改查效率较高
LinkedList
底层结构:双向链表
增删效率较高
改查效率较低