当前位置: 首页 > news >正文

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():①取出下一个元素 ②指针向后移动一位
基础代码模板:

Iterator<String>it=coll.iterator();while(it.hasNext()){Strings=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 回车自动补全
示例:

for(Strings:coll){System.out.println(s);}

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

方式 3:forEach Lambda 遍历(JDK8,最简仅遍历)
集合forEach()方法,参数为 Consumer 函数式接口
1.完整匿名内部写法
2.简化 Lambda 写法(一行打印)
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 数组结构、线程安全,性能差,开发淘汰。

http://www.cnnetsun.cn/news/3794427.html

相关文章:

  • 终极指南:如何彻底禁用Windows Defender提升系统性能15-35%
  • UART指纹模块C语言驱动开发:从协议解析到实战优化
  • 基于YOLOv5的水果检测系统:从数据标注到GUI应用的全流程实践
  • 解决onnxsim模块缺失:从环境诊断到模型优化部署全攻略
  • 易学破哈希,关于哈希函数,有多么lose
  • Godot引擎VRM虚拟化身插件实战:从导入到高级控制全流程
  • 从零实现Attention-LSTM:PyTorch实战与情感分析应用
  • 贝叶斯分类器实战指南:从原理到应用,掌握朴素贝叶斯、高斯与伯努利模型
  • 基于Spark的气象大数据处理:架构设计、性能优化与实战应用
  • Java通用Word解析方案:兼容多格式、生产级实践指南
  • UE5程序化生成技术
  • 网盘直链下载助手:无需安装客户端,浏览器直接下载网盘文件的终极解决方案
  • 5分钟掌握地理数据编辑:让空间数据处理变得简单高效的终极指南
  • FOMO:超轻量目标检测模型,专为嵌入式与IoT设备设计
  • 什么图传设备能实现地对空10公里以上的稳定传输?云慧信达hd520A传输距离可达16km
  • Flume对接Kafka:构建高可靠实时数据管道的完整指南
  • BLE双模串口模块实战:从硬件选型到嵌入式与主机端开发全解析
  • Hadoop核心架构与集群搭建实战:从基础原理到环境部署
  • 10.5英寸HDMI AMOLED显示模组:从接口桥接到系统集成的技术解析
  • 第10天:指针 — 操作指南 ★★★ 全12天最重要的一天
  • 处理提示“wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。”【笔记】
  • WebPShop:Photoshop用户的终极WebP格式支持插件解决方案
  • 5分钟搭建3D打印机Web监控仪表盘:基于Flask的轻量级实践
  • GLM-5模型如何赋能智能体工程:从核心原理到实战应用
  • 有限元法核心原理与应用:从数学基础到工程实践
  • AI时代职场MBTI:五类角色重塑人机协作与职业发展
  • 桁架、管桁架、网架区别
  • 小模型如何实现精准文本长度控制?3B模型击败GPT-4的技术解析
  • 【大模型预备5】LLM应用迭代测评工程
  • 【AI驱动配置管理革命】:20年运维专家亲授5大落地陷阱与避坑指南