下面给你整理一份 Java进阶06:List集合 & 泛型(Generics) 的系统学习笔记,适合 Java 进阶阶段复习或学习。内容包括:概念、常见实现类、常用方法、泛型使用与注意事项。
一、List集合概述
在 Java 中,List 是 有序、可重复元素的集合,属于 Collection 体系。
继承结构:
Iterable
↑
Collection
↑
List
常见实现类:
ArrayListLinkedListVector(基本不用)
特点:
| 特性 | 说明 |
|---|---|
| 有序 | 按添加顺序存储 |
| 可重复 | 可以存储重复元素 |
| 有索引 | 可以通过下标访问 |
示例:
import java.util.*;
public class Demo {
public static void main(String[] args) {
List list = new ArrayList();
list.add("A");
list.add("B");
list.add("A");
System.out.println(list);
}
}
输出:
[A, B, A]
二、List常用方法
List 除了 Collection 方法,还增加了 索引操作。
1 添加元素
list.add("Java");
list.add(1,"Python"); // 指定位置添加
2 获取元素
String s = list.get(0);
3 修改元素
list.set(0,"C++");
4 删除元素
list.remove(0); // 按索引删除
list.remove("Java"); // 按对象删除
5 获取长度
list.size();
6 遍历List
方法1:for循环
for(int i = 0; i < list.size(); i++){
System.out.println(list.get(i));
}
方法2:增强for
for(String s : list){
System.out.println(s);
}
方法3:迭代器
Iterator<String> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
三、ArrayList
ArrayList 是 最常用的 List 实现类。
底层结构:
动态数组
特点:
| 特点 | 说明 |
|---|---|
| 查询快 | 通过索引 |
| 增删慢 | 需要移动元素 |
| 线程不安全 | 效率高 |
示例:
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
四、LinkedList
底层结构:
双向链表
特点:
| 特点 | 说明 |
|---|---|
| 查询慢 | 需要遍历 |
| 增删快 | 不需要移动元素 |
示例:
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add("B");
list.add("C");
LinkedList特有方法
addFirst(E e) // 头部添加
addLast(E e) // 尾部添加
getFirst()
getLast()
removeFirst()
removeLast()
示例:
LinkedList<String> list = new LinkedList<>();
list.addFirst("A");
list.addLast("B");
System.out.println(list);
五、ArrayList vs LinkedList
| 对比 | ArrayList | LinkedList |
|---|---|---|
| 底层结构 | 动态数组 | 双向链表 |
| 查询 | 快 | 慢 |
| 增删 | 慢 | 快 |
| 内存 | 较少 | 较多 |
面试口诀:
查询多用ArrayList
增删多用LinkedList
六、泛型(Generics)
泛型是 JDK5 引入的类型安全机制。
作用:
1️⃣ 限制集合存储的数据类型
2️⃣ 避免强制类型转换
3️⃣ 提高代码安全性
1 不使用泛型
List list = new ArrayList();
list.add("Java");
list.add(100);
问题:
类型不安全
取值需要强转:
String s = (String)list.get(0);
2 使用泛型
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
优点:
- 编译期检查
- 不需要强制类型转换
3 泛型语法
集合类型<数据类型>
示例:
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
七、泛型类
自定义泛型类:
class Box<T> {
private T data;
public void set(T data){
this.data = data;
}
public T get(){
return data;
}
}
使用:
Box<String> box = new Box<>();
box.set("Java");
System.out.println(box.get());
八、泛型方法
定义:
public <T> void show(T t){
System.out.println(t);
}
示例:
public class Demo {
public static <T> void print(T t){
System.out.println(t);
}
public static void main(String[] args){
print("Java");
print(100);
}
}
九、泛型通配符
1 ?
表示 任意类型
List<?> list
示例:
public static void print(List<?> list){
for(Object o : list){
System.out.println(o);
}
}
2 上界
<? extends 类型>
表示:
该类型 或 子类
示例:
List<? extends Number>
可以是:
Integer
Double
Float
3 下界
<? super 类型>
表示:
该类型 或 父类
示例:
List<? super Integer>
可以是:
Integer
Number
Object
十、面试高频题
1 ArrayList 和 LinkedList 区别
答:
ArrayList 底层是动态数组,查询快,增删慢
LinkedList 底层是双向链表,查询慢,增删快
2 泛型的作用
答:
1 提高代码安全性
2 避免类型强转
3 编译期检查类型
3 为什么集合要使用泛型
答:
避免 ClassCastException
十一、完整示例
import java.util.*;
public class Demo {
public static void main(String[] args){
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
for(String s : list){
System.out.println(s);
}
}
}
输出:
Java
Python
C++
如果你需要,我可以继续帮你整理下一节 Java进阶07:Set集合 & HashSet & TreeSet(面试重点),那一章是 Java集合面试最核心内容之一。