1. List集合的特点
元素有序,可以重复
2. List遍历方式
- 方法1
通过下标for循环
//通过for下标遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
- 方法2
foreach循环
//通过foreach遍历
for (Integer integer : list) {
System.out.println(integer);
}
- 方法3
迭代器
//通过迭代器遍历
Iterator<Integer> it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
- 方法4
JDK1.8新特性
//JDK1.8新特性
list.forEach(n -> System.out.println(n));
//通过过滤器筛选
list.stream().filter(n -> n.intValue() == 4)
.collect(Collectors.toList())
.forEach(a -> System.out.println(a));
3.List集合的扩容机制
初始容量10,负载因子0.5,扩容增量0.5倍
数组的初始容量为10,当数组里面的数值达到10*0.5=5的时候
扩容增量0.5倍,扩容后的容量是原容量的1.5
4.List集合的实现
- ArrAyList
简单数据结构,超出容量会自动扩容,动态数组
内部实现是基于基础的对象数组的
随机访问快
不适合随机增加或删除
因为ArrayList底层是数组实现的,根据下标查询不需要比较,所以比较快;增删会带来元素的移动,增加数据会向后移动,删除数据会向前移动,所以影响效率。
线程是不安全的
因为函数没有使用任何加锁机制
运行速度快
- LinkedList
LinkedList提供额外的get,remove,insert方法 ,可以在LinkedList的首部或尾部进行操作
线程不安全
因为函数没有使用任何加锁机制
LinkedList可被用作堆栈(stack)【包括了push,pop方法】,队列(queue)或双向队列(deque)
堆栈:类似给弹夹上子弹的数据结构先进后出,push表示入栈,pop表示出栈
队列:先进先出
适合做随机的增加或删除
- vector
安全性高
底层代码部分函数都有使用同一个对象锁所以安全
现已被CopyOnWriteArrayList替代
因为底层部分函数都是用的同一个对象锁,所以性能慢,比如在某一个人在使用一个函数的时候,跟这个函数用一个对象锁的函数别人也不能使用
- CopyOnWriteArrayList
写时复制
在写入数据的时候写把原集合复制一份在复制的集合上进行操作,然后再赋值给原集合,这样假如在写入数据的时候正好有用户在进行读取数据用户就是读取的原集合,当新集合写入好了再给用户读取
写时复制出一个新的数组,完成插入,修改,或者移除操作后将新数组赋值给array
线程安全
适合于读多,写少的场景
比vector性能高
达成最终一致性
实现了list接口,使用方式与ArrayList类似