1. List系列集合特点
- ArrayList、LinekdList:有序、可重复、有索引。
- ArrayList底层基于数组实现的,根据元素查询快,增删相对慢。
- LinkedLsit底层基于双链表实现的,查询元素慢,增删首位元素快。
2. List集合常用API
/**
* List集合:有序、可重复、有索引
*/
public class ListDemo1 {
public static void main(String[] args) {
//1、创建一个ArrayList集合对象
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Java");
list.add("MySQL");
list.add("MySQL");
System.out.println(list);
//2、在某个位置插入元素
list.add(2, "HTML");
System.out.println(list);
//3、根据索引删除元素,返回被删除元素
System.out.println(list.remove(2));
System.out.println(list);
//4、根据索引获取元素
System.out.println(list.get(2));
//5、修改索引位置处的元素
list.set(3,"HiveSQL");
System.out.println(list);
}
}
3. List集合遍历方式
- 迭代器
- 增强for
- Lambda表达式
- for循环(List集合存在索引)
前三种方式为collection通用,详见: java集合之【Collection】
public class ListDemo2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("java1");
list.add("java2");
list.add("java3");
//1、使用迭代器Iterator
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
//2、使用增强for(foreach)
for (String ele : list) {
System.out.println(ele);
}
//3、使用Lambda表达式写法
list.forEach(s -> {
System.out.println(s);
});
//4、使用普通for
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
4. 原理
4.1 ArrayList原理
- ArrayList底层是基于数组实现的,根据索引定位元素快,增删需要做元素的位移操作。
- 第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10 的数组。
- 当插入的元素位置等于数组长度时,新建数组扩容为原长度的1.5倍,并对元素迁移。
4.2 LinkedList原理
- 底层数据结构是双链表、查询慢,首尾操作速度快。
/**
* LinkedList特有方法
*/
public class LinkedDemo1 {
public static void main(String[] args) {
//栈
LinkedList<String> stack = new LinkedList<>();
stack.addFirst("第1颗");//stack.push("第一颗")
stack.addFirst("第2颗");
stack.addFirst("第3颗");
stack.addFirst("第4颗");
System.out.println(stack);
//出栈
System.out.println(stack.removeFirst());//stack.pop("1号");
System.out.println(stack);
//队列
LinkedList queue = new LinkedList<>();
queue.addLast("1号");
queue.addLast("2号");
queue.addLast("3号");
queue.addLast("4号");
System.out.println(queue);
//出队
queue.removeFirst();
System.out.println(queue);
}
}
5. 问题
并发修改异常。
- 迭代器遍历集合且直接用集合删除元素的时候可能出现。
- 增强for循环遍历集合且直接用集合删除元素的时候可能出现。
不出问题的方式:
- 迭代器遍历集合但是用迭代器自己的删除方法操作。(用List的方法操作对迭代器是未知的)
- 使用for循环操作不会出现这个问题。(倒着删或删除后i–)