Java 集合框架详解:List、Set、Map 的区别与使用场景
【摘要】 Java 集合框架详解:List、Set、Map 的区别与使用场景 前言Java 集合框架是 Java 开发中最常用的工具之一,几乎每个项目都会用到。本文带你快速梳理 List、Set、Map 三大核心接口的区别、常用实现类以及使用场景,适合初学者快速上手,也适合老手温故知新。 一、集合框架总览Java 集合框架主要分为两大类:Collection:存储单个元素,包括 List、Set、Q...
Java 集合框架详解:List、Set、Map 的区别与使用场景
前言
Java 集合框架是 Java 开发中最常用的工具之一,几乎每个项目都会用到。本文带你快速梳理 List、Set、Map 三大核心接口的区别、常用实现类以及使用场景,适合初学者快速上手,也适合老手温故知新。
一、集合框架总览
Java 集合框架主要分为两大类:
- Collection:存储单个元素,包括 List、Set、Queue
- Map:存储键值对(Key-Value)
Collection
├── List(有序、可重复)
│ ├── ArrayList
│ ├── LinkedList
│ └── Vector
├── Set(无序、不可重复)
│ ├── HashSet
│ ├── LinkedHashSet
│ └── TreeSet
└── Queue(队列)
├── PriorityQueue
└── ArrayDeque
Map(键值对)
├── HashMap
├── LinkedHashMap
├── TreeMap
└── ConcurrentHashMap
二、List:有序可重复
List 是最常用的集合类型,元素有序且允许重复。
常用实现类对比
| 特性 | ArrayList | LinkedList | Vector |
|---|---|---|---|
| 底层结构 | 动态数组 | 双向链表 | 动态数组 |
| 随机访问 | O(1) | O(n) | O(1) |
| 插入删除 | 尾部O(1),中间O(n) | 已知位置O(1) | 同ArrayList |
| 线程安全 | 否 | 否 | 是 |
| 适用场景 | 读多写少 | 频繁增删 | 不推荐 |
代码示例
import java.util.*;
public class ListDemo {
public static void main(String[] args) {
// ArrayList 示例
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("Go");
System.out.println("获取第二个元素:" + list.get(1));
System.out.println("集合大小:" + list.size());
// 遍历
for (String item : list) {
System.out.println(item);
}
}
}
三、Set:无序不可重复
Set 用于存储不重复的元素,常用于去重场景。
常用实现类对比
| 特性 | HashSet | LinkedHashSet | TreeSet |
|---|---|---|---|
| 底层结构 | HashMap | LinkedHashMap | 红黑树 |
| 有序性 | 无序 | 插入顺序 | 自然排序 |
| 时间复杂度 | O(1) | O(1) | O(log n) |
| 允许null | 是 | 是 | 否 |
代码示例
import java.util.*;
public class SetDemo {
public static void main(String[] args) {
// 去重示例
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(2); // 重复,不会添加
set.add(3);
System.out.println("去重后:" + set); // [1, 2, 3]
}
}
四、Map:键值对存储
Map 用于存储键值对,通过 Key 快速查找 Value。
常用实现类对比
| 特性 | HashMap | LinkedHashMap | TreeMap | ConcurrentHashMap |
|---|---|---|---|---|
| 底层结构 | 数组+链表+红黑树 | 同上+双向链表 | 红黑树 | 数组+链表+红黑树 |
| 有序性 | 无序 | 插入顺序 | Key排序 | 无序 |
| 线程安全 | 否 | 否 | 否 | 是 |
| 允许null键 | 是 | 是 | 否 | 否 |
代码示例
import java.util.*;
public class MapDemo {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Java", 1);
map.put("Python", 2);
map.put("Go", 3);
// 获取值
System.out.println("Python的编号:" + map.get("Python"));
// 遍历
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
}
}
五、如何选择?
- 需要有序且可重复 → 选
ArrayList - 需要去重 → 选
HashSet - 需要键值对映射 → 选
HashMap - 需要线程安全 → 选
ConcurrentHashMap或Collections.synchronizedXxx() - 需要保持插入顺序 → 选
LinkedHashMap/LinkedHashSet - 需要排序 → 选
TreeMap/TreeSet
六、常见面试题
- ArrayList 和 LinkedList 的区别?
ArrayList 基于数组,随机访问快;LinkedList 基于链表,增删快。 - HashMap 的底层原理?
JDK 1.8 之前是数组+链表,1.8 之后引入红黑树,链表长度超过8且数组长度≥64时转为红黑树。 - HashMap 和 ConcurrentHashMap 的区别?
HashMap 线程不安全;ConcurrentHashMap 通过 CAS + synchronized 实现线程安全,并发性能更好。 - HashSet 如何保证元素不重复?
底层基于 HashMap,利用 Key 的hashCode()和equals()方法判断是否重复。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)