第六单元【Java集合框架】List、Set、Map、泛型、比较器 最全总结
一、集合总览
存储特性:仅能存储引用类型对象,所有集合工具类均位于 java.util 包下。
两大分支:Collection单列集合(存储单个元素)、Map双列集合(存储键值对)。
Collection三大子接口特性
List:元素有序、带下标、允许重复。
Set:元素无序、无下标、不允许重复。
Queue:队列结构,遵循先进先出(FIFO) 规则。
二、List 接口三大实现类
1. ArrayList
底层结构:动态数组,初始容量10,满容量后扩容1.5倍。
性能特点:查询、遍历速度极快;数组中间位置增删元素效率低。
线程特性:线程不安全,单线程开发首选集合。
2. LinkedList
底层结构:双向链表,无固定容量、无扩容机制。
性能特点:首尾增删元素效率极高;根据下标随机查询速度慢。
3. Vector
老旧集合(JDK1.0),所有方法添加 synchronized 锁保证线程安全。
运行效率极低,目前业务开发基本淘汰。
面试重点:ArrayList vs LinkedList
1. 遍历、随机获取元素场景:ArrayList性能完胜。
2. 频繁首尾插入、删除元素场景:LinkedList更优。
3. 日常业务90%场景:优先使用ArrayList。
三、Set 接口实现类
1. HashSet(核心重点)
特性:元素无序、不可重复,底层基于HashMap实现。
自定义对象去重规则:必须同时重写 hashCode() 和 equals() 方法。
底层去重执行逻辑
1. 先对比两个对象的hashCode值,值不同则直接判定为不同对象。
2. hashCode值相同时,再调用equals()方法对比内容,内容不同才判定为新对象。
2. TreeSet
- 特性:集合元素自动排序。
- 自定义类存入要求:必须实现 Comparable 接口,重写 compareTo() 方法。
- 去重规则:compareTo方法返回0时,判定元素重复,无法存入集合。
3. LinkedHashSet
继承自HashSet,底层维护双向链表。
同时具备两大特性:保留元素插入顺序 + 保证元素不重复。
四、Map 键值对集合
1. 核心特点
Key键:唯一不可重复。
Value值:允许重复、可为空。
整体无序,无下标索引。
2. 主流实现类特性
HashMap:线程不安全,key、value均可为null,底层数组+链表+红黑树,读写效率最高,日常开发首选。
Hashtable:线程安全,key、value禁止为null,全量加锁,性能极差,已过时。
LinkedHashMap:继承HashMap,线程不安全,保留键值对插入顺序。
TreeMap:线程不安全,key禁止为null,底层红黑树,可根据key自动排序。
3. Map三种遍历方式(开发高频)
// 方式1:keySet 单独遍历键<String> keys = map.keySet();
for(String k : keys){
System.out.println(k+"="+map.get(k));
}
// 方式2:values 单独遍历值<String> values = map.values();
// 方式3:entrySet 键值对遍历(效率最高,开发首选)
<String,String>> entrys = map.entrySet();
for(Map.Entry<String,String> en : entrys){
en.getKey();
en.getValue();
}
五、集合工具类 Collections
- 概念区分:Collection是单列集合根接口,Collections是操作集合的静态工具类。
常用静态方法
- sort(List):对集合元素排序,自定义实体需实现Comparable接口。
- reverse(List):反转集合元素顺序。
- shuffle(List):随机打乱集合元素顺序。
- synchronizedList/Set/Map:将非线程安全集合转为线程安全集合。
六、两种比较器(排序核心)
1. 内置比较器 Comparable
- 定义位置:写在实体类内部。
- 使用方式:实现接口,重写compareTo方法,对比当前对象与传入对象。
- 特点:排序规则永久绑定实体类,仅支持一套固定规则。
2. 外置比较器 Comparator
- 定义位置:无需修改实体类,临时定义排序规则。
- 特点:灵活适配多套排序规则,优先级高于内置比较器。
外置比较器代码示例
Collections.sort(list, new<Worker>(){
public int compare(Worker w1, Worker w2) {
// 按年龄升序排序
return w1.getAge()-w2.getAge();
}
});
七、泛型
- 核心作用:编译期约束集合存储类型,提前拦截类型转换异常,提升代码安全性。
- 常用泛型标识:T(任意类型)、K(键)、V(值)、E(集合元素)。
- 强制限制:八种基本数据类型不能作为泛型,必须使用对应包装类。
更多推荐




所有评论(0)