老生常谈…对于大佬们根本都不用看的博客!
对于像我这种菜鸡还是得一步一步的来!如果有错误请大佬们指点指点!
List集合
List 集合存储的是有序的数据集合,数据结构特点是:读取快,修改慢,适合于读取多、写入修改少的场景。
其中ArrayList 类是很常用的 List 实现,底层是用数组实现的。读取元素的时间复杂度是 O(1),修改写入元素的时间复杂度是 O(N)。
List集合的子类
- ArrayList:底层为数组。
- LinkedList:底层为链表。
- Vector:底层为数组,线程安全。(实战场景几乎不用,了解即可)
- Stack:继承了 Vector,线程安全,先进后出的栈。(了解即可)
List集合的安全实现
Vector 类的数据结构与 ArrayList 非常类似。但它与 ArrayList 的一个最大的不同是:Vector 是线程安全的,而 ArrayList 则不是线程安全的。(全都是sychornized修饰)
Stack 类则是在 Vector 的基础上,实现了一个双向队列。所以它除了是线程安全的之外,也是一个先进后出的 List 实现。
List的常用方法
添加:
//队尾添加
boolean add(E e)
//指定下标添加
void add(int index, E element);
//添加另一个集合中的所有元素
boolean addAll(Collection<? extends E> c);
//指定下标添加另一个集合中的所有元素
boolean addAll(int index, Collection<? extends E> c);
获取:
//根据下标获取元素
E get(int index);
//根据开始下标和结束下标获取新的 List 集合(左闭右开):
List<E> subList(int fromIndex, int toIndex);
获取元素的下标
//根据从前往后的顺序查找下标
int indexOf(Object o);
//根据从后往前的顺序查找下标
int lastIndexOf(Object o);
**注意:**有重复的只返回第一个遇到的元素,如果没有查到就返回-1。
删除
//根据索引删除元素
E remove(int index);
//根据元素删除(删除第一个遇到的)
boolean remove(Object o);
//删除集合中存在入参的集合中所有的元素
boolean removeAll(Collection<?> c);
修改
//在指定下标进行修改
E set(int index, E element);
ArrayList
ArrayList的概况
- 具备了List接口的特性(有序、重复、索引);
- 集合底层是实现原理是数组,大小可变;
- 特点:查询速度快、增删慢;
- 线程不安全的集合,运行速度快;
ArrayList的扩容
- JDK7:直接创建了一个初始容量为 10 的数组,每次扩容是原来长度的 1.5 倍;
- JDK8:一开始创建一个长度为 0 的数组,当添加第一个元素的时候再创建一个容器为 10 的数组,每次扩容是原来长度的 1.5 倍;
LinkedList
LinkedList的概况
- 具备了List 接口的特性(有序、重复、索引);
- 集合底层是实现原理是双向链表;
- 增删速度快、查询慢;
- 线程不安全的集合,运行速度快;
Vector
Vector的概述
- 具备了List接口的特性(有序、重复、索引);
- 集合底层是实现原理是数组,大小可变;
- 线程安全,运行速度快慢;
Vector的扩容
半步扩容法(即扩容1.5倍)和2倍扩容法(即扩容2倍)
不同编译器扩容方式不同:
编译器 | 扩容倍数 |
---|---|
CLANG | 1.5 |
MSVC | 1.5 |
GCC | 2 |
选择不同的构造方式:
- 如果为无参构造,初始化容量为10,扩容为原容量的2倍;
- 如果为单参数构造,初始化容量为指定容量,扩容为原容量的2倍;
- 如果为两个参数的构造,初始化容量为指定容量,扩容为原容量加上扩容长度(ArrayList不存在这种构造方式);