java 操作集合的几种方法
最近在做一些文件处理相关的项目,其中大量用到了集合,因此,本篇着重对集合相关基础知识进行整理。如有希望补充的地方,请评论区留言。
一、Java的几种集合

再来看看常用的几种集合


二、每种集合的区别。
这个问题,可以说是老生常谈了,这里只做简单对比,详细信息请自行翻阅资料。

三、常用的集合操作方法
1. 迭代器
适用所有集合;显式控制遍历流程、支持删除操作;适用于需要动态修改集合的场景

2. 传统的for循环
适用于数组或固定大小的集合;基于索引访问元素,性能稳定,但灵活性低

3. 增强版for循环(For-each)
实现了Iterable接口的集合;语法简洁,编译后转化为迭代器实现,避免显式迭代器;简洁易读,但无法修改集合

4. Lambda表达式
用于过滤(filter)和转换(map)集合元素;Java 8及以上版本;函数式编程风格,代码更简洁,但代码开销略大 
5. Stream API 流式操作
支持去重(distinct)和排序(sorted)操作;声明式操作,支持链式调用和并行处理,性能优于传统for循环

6. 并行流遍历
需要并行处理的集合;自动多线程处理,适合大数据量场景,有效提升性能(需注意线程安全)
![]()
四、Stream 和Lamba的效率
1. Lambda表达式开销大原因
- 匿名内部类实现:早期Java版本中,Lambda表达式通过匿名内部类实现,每次创建都会生成新的类实例,导致内存消耗增加。
- 字节码生成复杂:Lambda表达式编译后需生成动态方法调用(invokedynamic指令),增加了字节码复杂度和类加载开销。
- 对象创建频繁:在循环中使用Lambda(如forEach)会频繁创建函数式接口实例,增加GC压力。
- 不可变性要求:函数式编程强调数据不可变性,频繁创建临时对象导致内存开销。
2. Stream流开销大原因
- 中间操作延迟执行:Stream的中间操作(如filter、map)返回新流对象,延迟执行导致对象生命周期长。
- 对象链生成:链式操作(如stream().filter().map().collect())会生成多个临时流对象,增加内存占用。
- 并行流线程管理:并行流通过ForkJoinPool管理线程,线程上下文切换和任务拆分增加开销。
- 不可变性限制:Stream操作不可变,无法修改源数据,需创建新对象导致额外开销。
3. Lambda和Stream性能优化建议
- 缓存Lambda表达式:避免在循环中重复创建Lambda实例,使用方法引用或缓存Lambda。
- 选择合适场景:小数据集或性能敏感场景优先使用传统循环,大数据集可考虑并行流。
- 减少中间操作:合并链式操作(如filter().map()合并为map())减少临时对象生成。
- 避免共享状态:并行流操作需确保线程安全,避免修改外部变量。
五、函数式编程 FP
函数式编程是以数学函数为核心、强调纯函数与不可变数据的声明式编程范式。
1. 核心特点
- 纯函数:函数无副作用,输入相同输出相同,不修改外部状态。
- 不可变性:数据不可变,修改操作返回新对象。
- 高阶函数:函数作为参数或返回值。
- 声明式编程:描述操作而非实现细节。
- 函数组合:小函数组合成复杂逻辑。
2. 优势
- 简洁性:代码更简洁,易于测试和维护。
- 并行性:天然支持并行处理(如Java Stream的并行流)。
- 可重用性:函数可复用,减少代码冗余。
六、面向对象编程 OOP
面向对象编程是一种以对象为核心的软件开发方法和编程范式,它将数据和相关操作封装在一起,更贴近人类认识世界的方式。
1. 四大基本特性
-
封装:把属性和方法打包进类,隐藏内部细节,只暴露对外接口。
-
继承:子类复用父类代码,减少重复,实现代码复用。
-
多态:同一行为,不同对象表现不同效果。
-
抽象:抽取共性特征,提炼成类模型。
2. 核心概念
- 类 Class:模板,定义属性、行为
- 对象 Object:类实例,真实个体
- 成员变量:对象状态数据
- 成员方法:对象动作行为
- 构造方法:创建对象时初始化
更多推荐




所有评论(0)