list集合特点:
list集合中元素是有序的。
list集合中元素是可重复的。
list集合的遍历:
foreach,迭代器
List<Integer> list=new ArrayList<Integer>();
@Before
public void setup() {
list.add(1);
list.add(2);
list.add(3);
list.add(3);
list.add(4);
}
/**
* foreach遍历
*/
@Test
public void list01() {
for(Integer e:list){
System.out.println(e);
}
}
/**
* for循环
*/
@Test
public void list02() {
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
/**
* 迭代器
*/
@Test
public void list03() {
Iterator<Integer> it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
扩容:
- 初始容量10,负载因子0.5,扩容增量0.5倍
- 新容量 = 原容量 + 原容量 * 0.5
public void listKR()throws Exception {
List<Integer> list=new ArrayList<Integer>();
for(int i=0;i<=100;i++) {
list.add(i);
System.out.println("i :"+i);
System.out.println("length :"+getListElsSize(list));
}
}
private int getListElsSize(List obj)throws Exception {
Class<? extends List> clazz = obj.getClass();
Field f = clazz.getDeclaredField("elementData");
f.setAccessible(true);
Object[] object =(Object[]) f.get(obj);
return object.length;
}
LinkedList
- LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部
- 线程不安全
- LinkedList可被用作堆栈(stack)【包括了push,pop方法】,队列(queue)或双向队列(deque)
- 以双向链表实现,链表无容量限制,允许元素为null,线程不安全
- 适合做随机的增加或删除
Vector
- 线程安全
- 并行性能慢,不建议使用
CopyOnWriteArrayList
- 写时复制
- 线程安全
- 适合于读多,写少的场景
- 写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值给array
- 比Vector性能高
- 最终一致性
- 实现了List接口,使用方式与ArrayList类似
ArrayList
- 简单数据结构,超出容量自动扩容,动态数组
- 内部实现是基于基础的对象数组的
- 随机访问快
- 不适合随机增加或删除
- 线程不安全
删除时的注意点
测试数据准备,为更好的显示问题,在构建的List集合中有紧挨在一起的两个或两个以上的元素
list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(3);
list.add(4);
1. 下标循环删除方式1
for(int i = 0; i<list.size(); i++) {
if(list.get(i) == 3) list.remove(i);
}
2. 下标循环删除方式2
for(int i = 0; i < list.size(); i++) {
if(list.get(i) == 3) list.remove(i--);
}
3. 下标循环倒序删除
for(int i = list.size() - 1; i >= 0; i--) {
if(list.get(i) == 3) list.remove(i);
}
4. foreach循环删除
for(Integer e: list) {
if(e == 3) {
list.remove(e);
}
}
删除的参数是基本型的整数
list.remove(i)