先阅读Java 集合框架 | 菜鸟教程https://www.runoob.com/java/java-collections.html

写的非常好,看完再来看这篇

一、先搞懂:Java 中的 “集合” 到底是什么?

1. 集合的核心定义

集合(Collection)是 Java 提供的一组用于存储多个对象的容器,本质是 “存放数据的盒子”,和你熟悉的数组功能类似,但功能更强大、使用更灵活。

2. 为什么需要集合?(对比数组)

你已经学过数组(int[]/String[]),数组的缺点就是集合的优势:

特性 数组 集合
长度 固定不变(创建时指定,无法扩容) 动态可变(自动扩容,无需关心长度)
存储类型 只能存同一类型的元素(且基本类型 / 引用类型二选一) 可存任意引用类型(泛型限定后更安全)
功能 仅支持简单的增删(需手动移动元素),无现成方法 内置大量实用方法(排序、查找、去重、遍历)
适用场景 元素数量固定、类型单一的简单场景 元素数量动态变化、需要复杂操作的场景

生活化例子

  • 数组就像 “固定容量的抽屉”:买的时候就定了能放 10 件东西,放满了就塞不进去,想拿中间的东西还得把前面的都挪开;
  • 集合就像 “可伸缩的收纳箱”:能自动变大,内置了 “分类”“查找”“删除” 的功能,想拿东西直接说 “找红色的杯子” 就行,不用自己翻。

3. 集合的核心特点

  • 只能存储引用类型(如 Integer、String、自定义对象),不能直接存基本类型(int、char 等,需用包装类如 Integer 替代);
  • 支持动态扩容(如 ArrayList 默认初始容量 10,满了自动扩容 1.5 倍);
  • 提供丰富的操作方法(add/remove/contains/sort 等),无需自己手写逻辑;
  • 集合框架是一套完整的体系,不同集合有不同特性,适配不同场景。

二、Java 集合的整体架构(核心骨架)

Java 集合框架(Java Collections Framework,JCF)主要分为两大分支,所有集合类都基于这两个顶级接口:

Java集合框架
├─ Collection接口(存储单个元素的集合)
│  ├─ List接口(有序、可重复)
│  │  ├─ ArrayList(动态数组,查询快)
│  │  ├─ LinkedList(双向链表,增删快)
│  │  └─ Vector(线程安全的动态数组,性能差)
│  ├─ Set接口(无序、不可重复)
│  │  ├─ HashSet(哈希表实现,查找快)
│  │  ├─ LinkedHashSet(有序的HashSet)
│  │  └─ TreeSet(有序的Set,按自然顺序排序)
│  └─ Queue接口(队列,先进先出FIFO)
│     ├─ LinkedList(也实现了Queue)
│     └─ PriorityQueue(优先级队列)
└─ Map接口(存储键值对<K,V>的集合)
   ├─ HashMap(哈希表实现,查询快)
   ├─ LinkedHashMap(有序的HashMap)
   ├─ TreeMap(有序的Map,按键排序)
   └─ Hashtable(线程安全的HashMap,性能差)

核心分支说明:

1. Collection 接口(单元素集合)

存储 “单个元素” 的集合,比如List<String>存的是一个个 String,Set<Integer>存的是一个个 Integer。

  • List:有序、可重复(按插入顺序存储,能存多个相同元素);
  • Set:无序、不可重复(元素唯一,无索引);
  • Queue:队列,遵循 “先进先出”(FIFO),比如排队买票,先到先得。
2. Map 接口(键值对集合)

存储 “键值对(Key-Value)” 的集合,比如HashMap<String, Integer>可以存{"张三":18, "李四":20},通过 “键”(张三)快速找到 “值”(18)。

  • 键(Key):唯一,不能重复;
  • 值(Value):可以重复;
  • 核心特点:通过键快速查找值(时间复杂度接近 O (1))。

三、集合的核心分类(新手必掌握的 4 个核心集合)

作为新手,不用学所有集合,先掌握这 4 个最常用的,就能覆盖 90% 的开发场景:

1. ArrayList(List 接口)

  • 底层结构:动态数组;
  • 核心特性:有序、可重复、支持索引访问;
  • 优势:查询(get)、遍历速度快;
  • 劣势:中间位置增删(add/remove)速度慢(需移动数组元素);
  • 适用场景:查询多、增删少的场景(如展示列表数据)。

2. LinkedList(List+Queue 接口)

  • 底层结构:双向链表;
  • 核心特性:有序、可重复、支持索引(但索引访问慢);
  • 优势:首尾增删(addFirst/addLast)速度快;
  • 劣势:查询速度慢(需从头 / 尾遍历找元素);
  • 适用场景:增删多、查询少的场景(如队列、栈)。

3. HashSet(Set 接口)

  • 底层结构:哈希表;
  • 核心特性:无序、不可重复、无索引;
  • 优势:添加、删除、查找速度极快;
  • 劣势:无序,无法按索引访问;
  • 适用场景:需要去重、快速查找的场景(如存储用户 ID,避免重复)。

4. HashMap(Map 接口)

  • 底层结构:哈希表;
  • 核心特性:键唯一、值可重复、无序;
  • 优势:通过键快速查找值;
  • 劣势:无序,键不能重复;
  • 适用场景:需要键值对映射的场景(如存储用户信息:ID→用户对象)。

四、集合的核心使用原则(新手避坑)

1. 优先用接口声明,实现类实例化(面向接口编程)

2. 用泛型限定元素类型(避免类型不安全)

3. 遍历集合的选择

  • List 集合:
    • 仅遍历 → 增强 for 循环;
    • 遍历中删除 → Iterator;
    • 按索引操作 → 普通 for 循环;
  • Set 集合:只能用增强 for 循环 / Iterator(无索引);
  • Map 集合:遍历键、值或键值对:

五、集合的核心思想:“合适的场景用合适的集合”

新手最容易犯的错:不管什么场景都用 ArrayList。其实不同集合有不同的设计目标,比如:

  • 想存 “有序、可重复” 的数据,且经常查询 → ArrayList;
  • 想存 “有序、可重复” 的数据,且经常增删 → LinkedList;
  • 想存 “不重复” 的数据,且快速查找 → HashSet;
  • 想存 “键值对”,通过键找值 → HashMap。

生活化例子

  • ArrayList = 书架(按顺序摆书,找指定位置的书快,插一本书到中间慢);
  • LinkedList = 项链(增删珠子快,找第 10 颗珠子慢);
  • HashSet = 无编号的储物柜(存东西快,找东西快,但不能按顺序找);
  • HashMap = 字典(按拼音 / 部首(键)找字(值),速度极快)。

总结

  1. 集合的本质:Java 提供的 “动态存储多个对象的容器”,解决数组长度固定、功能单一的问题;
  2. 核心分类
    • Collection(单元素):List(有序可重复)、Set(无序不可重复);
    • Map(键值对):键唯一、值可重复,通过键快速找值;
  3. 新手必掌握:ArrayList(查询快)、LinkedList(增删快)、HashSet(去重)、HashMap(键值对);
  4. 核心原则:面向接口编程(接口声明 + 实现类实例化)、用泛型限定类型、合适场景选合适集合。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐