List集合是Collection集合下的集合的一种,它有序,可重复,有索引。但由于存在不同的底层实现方法,适合的场景也不同。
ArrayList底层是基于数组存储数据的,而LinkedList底层是基于链表存储数据的。因此,前者因为可以根据索引查询数据,查询数据的速度快,而后者是通过前一个数据找到后一个数据,因此无论找什么数据都得从第一个数字开始寻找。但前者的缺点是增删数据的效率低,若是删除了一个数据连着后面的数据也需要进行改动(前面的数据没了后面的数据需要向前移动一位),而链表没有这个要求,只需要将删除数据前一位的后继改为删除数据的后一位数据,删除数据后一位数据的前驱改为删除数据的前一位数据即可实现删除,时间复杂度为O(1)。因此,两种集合各有特性,适用于不同的应用场景
示例(ArrayList)
package List;
import java.util.ArrayList;
import java.util.List;
public class ListDemo1 {
public static void main(String[] args) {
//目标:掌握List系列集合独有的功能
//有序,可重复,有索引
List<String> names = new ArrayList<>();
//添加元素
names.add("张三");
names.add("李四");
names.add("王五");
System.out.println(names); //[张三, 李四, 王五]
//给第三个数据插入一个数据:赵敏
names.add(2,"赵敏");
System.out.println(names); //[张三, 李四, 赵敏, 王五]
//删除李四,返回删除的元素
String remove = names.remove(1); //根据下标删除的数据,返回删除的元素
System.out.println(remove);
//王五改为金毛
System.out.println(names.set(2,"金毛")); //返回修改前的元素
System.out.println(names); //[张三, 赵敏, 金毛]
//获取张三
System.out.println(names.get(0));
//遍历支持for循环,增强for,lambda,迭代器
}
}
示例(LinkedList)
package List;
import java.util.LinkedList;
public class ListDemo2 {
public static void main(String[] args) {
//用LinkedList做一个队列对象
LinkedList<String> queue = new LinkedList<>();
//入队
queue.addLast("赵敏");
queue.addLast("陆小果");
queue.addLast("橙留香");
queue.addLast("梨花诗");
queue.addLast("菠萝吹雪");
//出队
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
System.out.println(queue);
//模拟栈
LinkedList<String> stack = new LinkedList<>();
stack.push("赵敏");
stack.push("陆小果");
stack.push("橙留香");
stack.push("梨花诗");
stack.push("菠萝吹雪");
//出栈
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack);
}
}
因为LinkedList集合的特有方法(头插,尾插,头删,尾删),模拟栈和队列等数据结构时,使用LinkedList集合更优。