目录
[1.1 ArrayLiat集合](#1.1 ArrayLiat集合)
[3.1 LinkedList的应用场景之一:可以用来设计队列](#3.1 LinkedList的应用场景之一:可以用来设计队列)
[3.2 LinkedList的应用场景之二:可以用来设计栈](#3.2 LinkedList的应用场景之二:可以用来设计栈)
1、List集合的特有方法
List集合支持索引,所以多了很多与索引相关的方法,当然,Collection的功能Liat也都继承了。

2、List系列集合
1.1 ArrayLiat集合
| 分类 | 方法名 / 属性 | 语法格式 | 功能说明 | 示例代码 | 注意事项 |
|---|---|---|---|---|---|
| ✅ 创建对象 | 构造方法 | new ArrayList<>() new ArrayList<>(初始容量``) new ArrayList<>(Collection<? extends E> c) |
创建一个空的 ArrayList 指定初始容量创建 用已有集合初始化 | ArrayList<String> list = new ArrayList<>(); ArrayList<Integer> list2 = new ArrayList<>(10); List<String> other = Arrays.asList("a", "b"); ArrayList<String> list3 = new ArrayList<>(other); |
推荐使用泛型 <E> 明确存储类型,避免类型错误 |
| ✅ 添加元素 | add(E e) |
list.add(element) |
在末尾添加一个元素 | list.add("Hello"); |
返回 true |
add(int index, E element) |
list.add(index, element) |
在指定索引位置插入元素,后续元素后移 | list.add(0, "World"); |
索引越界会抛出 IndexOutOfBoundsException |
|
| ✅ 获取元素 | get(int index) |
list.get(index) |
获取指定索引位置的元素 | String s = list.get(0); |
索引必须在 [0, size-1] 范围内 |
| ✅ 修改元素 | set(int index, E element) |
list.set(index, newElement) |
替换指定索引位置的元素 | list.set(0, "Hi"); |
返回被替换的旧元素 |
| ✅ 删除元素 | remove(int index) |
list.remove(index) |
删除指定索引位置的元素 | String removed = list.remove(0); |
返回被删除的元素 |
remove(Object obj) |
list.remove(obj) |
删除第一个匹配该对象的元素 | list.remove("Hi"); |
成功返回 true,否则 false;注意包装类型(如 Integer)比较 |
|
| ✅ 查询信息 | size() |
list.size() |
返回当前元素个数 | int count = list.size(); |
不是容量,而是实际元素数量 |
isEmpty() |
list.isEmpty() |
判断是否为空 | if (list.isEmpty()) {...} |
比 size() == 0 更推荐 |
|
contains(Object obj) |
list.contains(obj) |
判断是否包含某个元素 | boolean hasA = list.contains("a"); |
依赖 equals() 方法比较 |
|
indexOf(Object obj) |
list.indexOf(obj) |
返回第一次出现的位置,找不到返回 -1 | int pos = list.indexOf("a"); |
从前往后找 | |
lastIndexOf(Object obj) |
list.lastIndexOf(obj) |
返回最后一次出现的位置 | int lastPos = list.lastIndexOf("a"); |
从后往前找 | |
| ✅ 清空集合 | clear() |
list.clear() |
移除所有元素 | list.clear(); |
集合变为空,但对象仍存在 |
| ✅ 转换为数组 | toArray() |
list.toArray() T[] arr = list.toArray(new T[0]); |
将 List 转为数组 | String[] arr = list.toArray(new String[0]); |
推荐传入目标类型的空数组 |
| ✅ 遍历方式 | for 循环 | for(int i=0; i<list.size(); i++) |
通过索引遍历 | for(int i=0; i<list.size(); i++) System.out.println(list.get(i)); |
效率高,适合随机访问 |
| 增强 for 循环 | for(E e : list) |
简洁遍历 | for(String s : list) System.out.println(s); |
不能修改结构(如边遍历边删) | |
| 迭代器 Iterator | Iterator<E> it = list.iterator(); |
安全地遍历并删除 | Iterator<String> it = list.iterator();<br>while(it.hasNext()) {<br> String s = it.next();<br> if(s.equals("bad")) it.remove();<br>} |
遍历时删除必须用 it.remove() |
|
| ✅ 其他重要方法 | ensureCapacity(int minCapacity) |
list.ensureCapacity(50); |
预设最小容量,减少扩容开销 | (性能优化用) | 提前设置可提升性能 |
trimToSize() |
list.trimToSize(); |
将容量调整为当前大小,节省内存 | (内存优化用) | 减少内存占用 | |
| ⚠️ 线程安全 | ------ | ------ | ArrayList 不是线程安全的 |
多线程环境下可能出错 | 可使用 Collections.synchronizedList(new ArrayList<>()); 或 CopyOnWriteArrayList |
代码1:代码演示了ArrayList中的方法,几乎包括了上表中的所有方法
CollectionDemo1类
java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator; //
import java.util.List;
public class CollectionDemo1 {
public static void main(String[] args) {
System.out.println("------------------------创建ArrayList------------------------");
//创建ArrayList集合对象
//方法1 默认容量为10
ArrayList<Character> list = new ArrayList<>();
//方法2
//创建集合对象时,可以指定初始容量,如果添加的元素个数超过指定的初始容量,集合会自动扩容
ArrayList<Integer> list2 = new ArrayList<>(2);
list2.add(1);
list2.add(2);
list2.add(3);
System.out.println(list2);
//方法3
ArrayList<Integer> list3 = new ArrayList<>(Arrays.asList(1,2,3));
List<String> other = Arrays.asList("a", "b"); //不可变的列表(固定大小)
//other.add("c"); //添加元素运行时候会报错
System.out.println("asList->: " + other);
Integer[] a = {1,2,3};
List<String> list4 = new ArrayList<>(other); //用它来创建一个新的、可变的 ArrayList
list4.add("c");
System.out.println("asList 变为ArrayList->: " + list4);
//new ArrayList<>(Collection<? extends E> c)
List<String> list5 = new ArrayList<>(Arrays.asList("a", "b", "c"));
System.out.println("------------------------添加元素------------------------");
//使用list列表当前为空
list.add('a');
list.add('b');
list.add(1, 'c'); //在指定位置添加元素
list.add('e');
list.add('f');
list.add('e');
list.add('c');
list.add('c');
System.out.println(list);
System.out.println("------------------------获取元素------------------------");
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println("------------------------修改元素------------------------");
list.set(0, 'd');
System.out.println(list);
System.out.println("------------------------删除元素------------------------");
list.remove(0); //删除指定索引的元素
list.remove((Character) 'e'); //删除指定元素,出现第一次的 要确定数组中有这个元素,要给一个对象。
System.out.println(list);
System.out.println("------------------------返回当前数组长度------------------------");
System.out.println(list.size());
System.out.println("------------------------判断集合是否为空------------------------");
System.out.println(list.isEmpty());
System.out.println("------------------------判断集合中是否包含某个元素------------------------");
System.out.println(list.contains('a'));
System.out.println("------------------------返回集合的索引(第一个)------------------------");
System.out.println(list.indexOf('c')); //返回指定元素在集合中的索引(第一次),如果没有,返回-1
System.out.println("------------------------返回集合的索引(最后一个)------------------------");
System.out.println(list.lastIndexOf('c')); //返回指定元素在集合中的索引(最后一次),如果没有,返回-1
//迭代器
System.out.println("------------------------迭代器------------------------");
list.removeAll(list);
list.add('a');
//迭代安全删除
Iterator<Character> it = list.iterator();
// System.out.println(it.hasNext()); //
// while(it.hasNext()) { //判断集合中是否有下一个元素
// Character s = it.next();
// if(s.equals('c')) { //判断当前元素是否为c
// it.remove(); // ✅ 使用迭代器的remove方法
// System.out.println("删除了: " + s);
// }
// }
// System.out.println(list);
//如果这样删除可能会漏删元素 因为迭代器删除元素后,索引会改变
// for(int i = 0;i < list.size();i++){
// if(list.get(i).equals('c')){
// Character c = list.get(i);
// list.remove(i);
// System.out.println("删除了: " + c);
// }
// }System.out.println( list);
//加强 循环 程序崩溃
// for(Character c : list){
// if(c.equals('c')){
// list.remove(c);
// }
// }
//removeIf
list.removeIf(c -> c.equals('c')); //删除集合中所有满足条件的元素 JDK 8 才出现的方法
ArrayList list6 = new ArrayList<>();
list6.add('a');
list6.add('b');
System.out.println(list);
list.removeAll( list6); //删除list6集合中所有元素
System.out.println( list);
System.out.println("------------------------清空集合------------------------");
list.clear();
System.out.println(list);
}
}
3、ArrayList和LinkeList的区别及底层原理
ArrayList底层是基于数组存储数据的。
LinkeLsit底层是基于链表存储数据的。
数组的特点**查询速度快(注意:是根据索引查询数据快):**查询数据通过地址和索引定位,查询任意数据消耗时相同。
增删数据效率低:可能需要把后面很多的数据进行前移。
链表以及链表的特点
- 链表中的数据是一个一个独立的结点组成,结点在内存是不连续的,每个结点包含数据和下一个结点的地址
特点
- 查询慢,无论查询哪个数据都要从头开始找
- 链表增删相对快
- LinkedList集合基于双链表实现的。
- 双向链表的特点:对首位元素进行删除改查的速度是极快的。


3.1 LinkedList的应用场景之一:可以用来设计队列

java
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
//使用LinkedList设计一个队列
LinkedList<String> queue = new LinkedList();
//入队在队尾
queue.addLast("赵敏");
queue.addLast("小昭");
queue.addLast("武大郎");
queue.addLast("西门庆");
System.out.println(queue);
//出队在队首
System.out.println(queue.removeFirst()); //赵敏
System.out.println(queue.removeFirst()); //小昭
System.out.println(queue.removeFirst()); //武大郎
System.out.println(queue.removeFirst()); //西门庆
}
}
/*
[赵敏, 小昭, 武大郎, 西门庆]
赵敏
小昭
武大郎
西门庆
*/
3.2 LinkedList的应用场景之二:可以用来设计栈

java
import java.util.LinkedList;
public class LinkedListDemo1 {
//用linkedlist实现栈
public static void main(String[] args) {
//使用linkedlist实现栈
LinkedList<String> stack = new LinkedList<>();
//压栈
stack.addFirst("张无忌");
stack.addFirst("周芷若");
stack.addFirst("赵敏");
stack.addFirst("小昭");
System.out.println( stack);
//弹栈import java.util.LinkedList;
public class LinkedListDemo1 {
//用linkedlist实现栈
public static void main(String[] args) {
//使用linkedlist实现栈
LinkedList<String> stack = new LinkedList<>();
//压栈
stack.addFirst("张无忌");
stack.addFirst("周芷若");
stack.addFirst("赵敏");
stack.addFirst("小昭");
System.out.println( stack);
//弹栈
System.out.println(stack.removeFirst());
System.out.println(stack.removeFirst());
System.out.println(stack.removeFirst());
System.out.println(stack.removeFirst());
LinkedList<String> stack1 = new LinkedList<>();
//压栈 Java中提供了push和pop方法
stack1.push("张无忌");
stack1.push("周芷若");
stack1.push("赵敏");
stack1.push("小昭");
System.out.println( stack1);
//弹栈
System.out.println(stack1.pop());
System.out.println(stack1.pop());
System.out.println(stack1.pop());
System.out.println(stack1.pop());
}
}
/*
[小昭, 赵敏, 周芷若, 张无忌]
小昭
赵敏
周芷若
张无忌
[小昭, 赵敏, 周芷若, 张无忌]
小昭
赵敏
周芷若
张无忌
*/
System.out.println(stack.removeFirst());
System.out.println(stack.removeFirst());
System.out.println(stack.removeFirst());
System.out.println(stack.removeFirst());
LinkedList<String> stack1 = new LinkedList<>();
//压栈
stack1.push("张无忌");
stack1.push("周芷若");
stack1.push("赵敏");
stack1.push("小昭");
System.out.println( stack1);
//弹栈
System.out.println(stack1.pop());
System.out.println(stack1.pop());
System.out.println(stack1.pop());
System.out.println(stack1.pop());
}
}
