Java 集合框架详解:List、Set、Map 的区别与使用场景

举报
Brian-Tony 发表于 2026/10/20 16:01:43 2026/10/20
【摘要】 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

六、常见面试题

  1. ArrayList 和 LinkedList 的区别?
    ArrayList 基于数组,随机访问快;LinkedList 基于链表,增删快。
  2. HashMap 的底层原理?
    JDK 1.8 之前是数组+链表,1.8 之后引入红黑树,链表长度超过8且数组长度≥64时转为红黑树。
  3. HashMap 和 ConcurrentHashMap 的区别?
    HashMap 线程不安全;ConcurrentHashMap 通过 CAS + synchronized 实现线程安全,并发性能更好。
  4. HashSet 如何保证元素不重复?
    底层基于 HashMap,利用 Key 的 hashCode() 和 equals() 方法判断是否重复。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。