Java 集合进阶(一)

目录

1.Java 集合整体体系(单列 / 双列区分)
2.Collection 顶层父接口(所有单列集合通用方法)
3.单列集合三种通用遍历:迭代器、增强 for、Lambda forEach
4.List 接口:特点、独有索引方法、5 种遍历方式
5.四大基础数据结构(栈 / 队列 / 数组 / 链表)底层特性

一、Java 集合整体体系

1.两大分类

  1. 单列集合 Collection:每次只能存单个元素(一次添加一个)
  2. 双列集合 Map:每次存一对键值对 (key-value)(一次存两个关联数据,如商品名 + 价格)

2.Collection 下两大分支(接口)

(1)List 系列(有序、可重复、有索引)

实现类:ArrayList、LinkedList、Vector(过时,了解即可)

•有序:存入顺序 = 取出顺序(和大小排序无关)

•可重复:允许存放相同元素

•有索引:可以通过下标获取 / 修改元素

(2)Set 系列(无序、不可重复、无索引)

实现类:HashSet、TreeSet、LinkedHashSet

•无序:存入、取出顺序可能不一致

•不重复:自动去重(业务常用去重场景)

•无索引:不能通过下标操作元素

标识区分

红色 = 接口(不能 new 对象),蓝色 = 实现类(可直接创建对象)

我们之前学的 ArrayList 只是集合体系冰山一角。

二、Collection 顶层父接口

核心结论

Collection 是所有单列集合的祖宗接口,List、Set 全部继承它,里面所有方法单列集合通用。

Collection 是接口,不能直接 new,创建对象要用多态:Collection coll = new ArrayList<>();

Collection 6 大通用方法

1.add (E e) 添加元素

返回 boolean:

•List 集合:永远返回 true(允许重复)

•Set 集合:元素不存在 true,元素已存在 false(去重机制)

2.clear () 清空集合

删除集合内所有元素,集合变为空集合。

3.remove (Object o) 根据对象删除

⚠️ 注意:Collection 通用方法只能传对象,不能传索引(Set 无索引,无法统一提供按索引删除)

返回 boolean:元素存在删除成功 true,不存在 false。

4.contains (Object o) 判断是否包含元素

底层核心考点

底层依赖equals()方法对比对象:

•字符串、包装类:Java 已经重写 equals,对比内容,直接使用

•自定义类(Student/Teacher 等):默认用 Object 的 equals,对比地址值,内容相同不同对象会返回 false;必须手动重写 equals 方法(Alt+Insert 快速生成)

示例:两个 name、age 完全相同的 Student 对象,不重写 equals,coll.contains (新学生) 结果为 false。

5.isEmpty () 判断集合是否为空

底层判断集合 size ()==0,空返回 true,有元素 false。

6.size () 获取集合元素个数,返回 int

三、Collection 三种通用遍历方式

Set 无索引,普通 for 循环(靠下标)不能用,以下三种 List/Set 全部通用。

方式 1:迭代器 Iterator(无索引遍历,遍历中可删除)

1.使用三步

1.获取迭代器:Iterator it = coll.iterator(); 指针默认在集合 0 号元素前

2.boolean hasNext():判断指针下一位是否有元素,有 true 无 false

3.E next():①取出下一个元素 ②指针向后移动一位

基础代码模板:

java 复制代码
Iterator<String> it = coll.iterator();
while(it.hasNext()){
    String s = it.next();
    System.out.println(s);
}

4.迭代器 4 大必记坑点

  1. 无元素时调用 next () → NoSuchElementException 无元素异常(不是下标越界,迭代器无索引)
  2. 遍历完毕指针不会自动复位,再次遍历需要重新获取新迭代器
  3. 一次 hasNext 只能配套一次 next;循环内多次 next 会跳过元素、直接报错,需要先用变量接收元素
  4. 遍历过程中,不能用集合 add/remove 方法,会抛出ConcurrentModificationException并发修改异常
    ○解决:需要删除用迭代器自带it.remove();迭代器无 add 方法,遍历中无法新增元素

方式 2:增强 for 循环(JDK5,底层迭代器,仅遍历)

适用范围

所有单列集合、数组;双列 Map 不能直接使用

格式:for(元素类型 变量 : 集合/数组){}

快捷生成:集合名.for 回车自动补全

示例:

java 复制代码
for(String s : coll){
    System.out.println(s);
}

细节

循环内的变量只是拷贝副本,修改变量不会改变原集合中的元素。

方式 3:forEach Lambda 遍历(JDK8,最简仅遍历)

集合forEach()方法,参数为 Consumer 函数式接口

1.完整匿名内部写法

2.简化 Lambda 写法(一行打印)

java

java 复制代码
coll.forEach(s -> System.out.println(s));

底层:普通 for 循环遍历,依次把每个元素传给 accept 方法执行操作。

三种遍历选择场景

1.遍历过程需要删除元素 → 迭代器 Iterator

2.仅查看、无需增删 → 增强 for / Lambda forEach(代码最简)

四、List 接口(有序可重复有索引)

基础特性

继承 Collection,拥有上面全部 6 个方法 + 3 种通用遍历;

独有特性:有索引,提供基于下标操作的 4 个特有方法。

List 四大独有索引方法

1.add(int index,E e):指定下标插入元素,原元素整体后移

2.E remove(int index):按下标删除,返回被删除元素

⚠️ 重载坑:list.remove(1),实参 int 优先匹配下标删除;如果要删除数字 1 这个 Integer 对象,需要手动装箱Integer.valueOf(1)

3.set(int index,E e):修改指定下标元素,返回旧元素

4.E get(int index):根据下标获取元素,可配合 size () 实现普通 for 循环

List 共 5 种遍历方式

1.迭代器 Iterator(通用)

2.增强 for(通用)

3.Lambda forEach(通用)

4.普通 for 循环(独有,依靠 get+size,需要下标时使用)

5.ListIterator 列表迭代器(List 独有,Set 不能用)

ListIterator 列表迭代

继承 Iterator,新增:

  1. add(E e):遍历过程中添加元素(不会并发修改异常)
  2. hasPrevious() / previous() 反向遍历(前提:先正向走完指针到末尾,初始指针在头部直接反向会报错)

遍历场景选择

•仅遍历:增强 for / Lambda

•遍历要删除:Iterator

•遍历要新增:ListIterator(List 专属)

•需要操作下标:普通 for 循环

五、四大基础数据结构(ArrayList/LinkedList 底层原理前置)

1.栈 Stack

特点:先进后出,后进先出

结构:单端开口(栈顶),一端封闭;数据栈顶进、栈顶出。

2.队列 Queue

特点:先进先出,后进后出

结构:两端开口;后端入队,前端出队。

3.数组(ArrayList 底层)

内存:连续整块空间

优点:根据索引查询速度极快

缺点:中间 / 头部增删,后续元素全部移位,效率低

4.链表(LinkedList 底层,分单向 / 双向)

基础单元:节点(存储数据 + 下一个节点地址),内存不连续

单向链表:只能从头向后遍历

双向链表:节点存前驱 + 后继地址,头尾双向查找,查询效率提升

优点:增删只修改节点地址,无需移动大量元素,速度快

缺点:无随机索引,查询必须从头遍历,速度慢

四大结构对比速记

  1. 栈:先进后出
  2. 队列:先进先出
  3. 数组:查询快,增删慢
  4. 链表:查询慢,增删快

拓展

ArrayList 底层是数组;LinkedList 底层是双向链表,二者增删查询性能完全相反,业务按需选择。Vector 数组结构、线程安全,性能差,开发淘汰。

相关推荐
爱码小白2 小时前
importlib模块
开发语言·前端·python
令狐前生2 小时前
Intellij IDEA 2025 破解安装
java·ide·intellij-idea
数聚天成DeepSData2 小时前
数聚天成 DeepSData 数据价值落地实战指南
java·maven·devops
techdashen2 小时前
Go设计取舍之四: map不变时能否并发修改不同value
开发语言·后端·golang
小小小米粒2 小时前
阿姆达尔定律(Amdahl‘s Law)
java·开发语言
知彼解己2 小时前
Java 版本演进
java·开发语言·spring boot
风样滴男人哟3 小时前
PHP特性之反射类ReflectionClass机制
android·开发语言·php
极客先躯3 小时前
高级java每日一道面试题-2026年05月11日-实战篇[Docker]-如何容器化金融产品推荐系统?
java·运维·docker·容器·金融·高级面试·金融产品推荐系统
看昭奚恤哭3 小时前
Flutter 布局核心思想
开发语言·javascript·flutter