全新 30 组 Java 技术对比表格

覆盖 JVM 调优、Lambda、IO 模型、缓存、Spring 事务、注解、字符串、容器、异步、GC、文件操作等

1. soft 引用 vs weak 引用 vs phantom 引用(精简两两组对比,本表区分三者)

表格

对比维度SoftReference 软引用WeakReference 弱引用PhantomReference 虚引用
回收触发堆内存不足 GC 才回收下一次 GC 直接回收对象真正销毁前入队列
get () 取值可正常获取对象GC 后 get 返回 nullget 永远返回 null
适用场景大图片、可重建缓存临时缓存、WeakHashMap堆外内存、资源释放监控
内存缓解能有效防止 OOM无法缓解内存溢出不持有对象,不减少内存占用

2. Spring 编程式事务 vs 声明式 @Transactional 事务

表格

对比维度编程式事务 (TransactionTemplate)声明式 @Transactional
代码侵入高,业务代码嵌入事务模板低,注解无业务侵入
粒度控制可精准控制局部代码块事务粒度为整个 public 方法
回滚规则代码手动控制 commit/rollback注解配置回滚异常规则
异常感知代码内可灵活判断分支回滚统一全局规则,分支难自定义
适用场景复杂多分支、动态事务逻辑绝大多数常规 CRUD 业务

3. synchronized 偏向锁 vs 轻量级锁 vs 重量级锁

| 对比维度 | 偏向锁 | 轻量级锁 | 重量级锁 || ---- | ---- | ---- || 竞争场景 | 全程单线程无竞争 | 多线程交替执行,无并发争抢 | 同一时间多线程争抢锁 || 底层实现 | 标记位记录线程 ID,无 CAS 自旋 | CAS 自旋抢锁,无内核阻塞 | 操作系统内核互斥锁,线程阻塞 || 性能开销 | 几乎无消耗,最优 | 自旋消耗 CPU,无线程切换 | 上下文切换,开销极大 || 适用场景 | 单线程反复获取同一锁 | 低并发交替执行代码块 | 高并发激烈竞争场景 |

4. Stream filter + map vs map + filter

表格

对比维度先 filter 后 map先 map 后 filter
对象处理数量过滤后再转换,减少 map 执行次数所有元素全部转换,转换次数更多
性能表现数据量大时性能更优产生大量无用转换对象,GC 压力高
逻辑顺序先过滤无效数据,再加工有效数据全量加工再丢弃,浪费计算资源
推荐规范业务优先使用先过滤后映射仅特殊场景必须先转换再过滤

5. Stream findFirst() vs findAny()

表格

对比维度findFirst()findAny()
有序流行为固定取第一个元素随机返回任意匹配元素
并行流行为依旧保证有序,性能损耗高并行不保证顺序,执行更快
底层逻辑有状态有序操作,需维护顺序无状态,并行分片独立查找
业务场景依赖数据顺序的业务只需要任意一条匹配数据,追求并行性能

6. ArrayList ensureCapacity () vs 初始化指定容量 new ArrayList (n)

表格

对比维度new ArrayList<>(初始容量)list.ensureCapacity(minCapacity)
执行时机集合创建时一次性分配数组集合已存在,事后扩容预分配
扩容次数创建即分配,全程无多次扩容避免多次扩容复制数组
内存开销启动直接占用对应容量数组已有数组基础上扩容,临时双倍内存
适用场景提前预知数据总量集合中途追加大量数据,提前扩容优化

7. 字符缓冲 BufferedReader vs Scanner 读取文本

表格

对比维度BufferedReaderScanner
读取速度底层缓冲区,读取大文件极快封装复杂,大量文本性能差
换行分割readLine () 直接读取整行需自定义分隔符处理换行
数据解析仅原始字符串,需手动转数字内置 nextInt/nextDouble 自动解析
内存占用轻量,缓冲区可控内部大量缓存,内存开销更大

8. JDK 原生 Timer vs ScheduledExecutorService 定时任务

表格

对比维度TimerScheduledExecutorService
底层线程单一线程串行执行所有任务线程池多线程并发执行
任务阻塞影响一个任务阻塞,所有任务延迟任务间互不阻塞,独立执行
异常容错任务抛异常,整个 Timer 直接终止单任务失败不影响其他定时任务
延迟精度时间漂移严重,误差大调度精度更高,支持灵活延迟策略

9. 不可变集合 toUnmodifiableList () vs stream.toList () JDK16

表格

对比维度Collectors.toUnmodifiableList()stream.toList() JDK16+
null 元素禁止存入 null,抛 NPE禁止存入 null,抛 NPE
底层实现内部 ImmutableList私有不可变实现类
JDK 版本JDK10 + 可用仅 JDK16 及以上
重复调用性能每次创建全新不可变对象语法更简洁,泛型推断更友好

10. AtomicInteger vs synchronized int 自增计数

表格

对比维度AtomicIntegersynchronized 修饰 int 变量
底层原理CAS 无锁自旋乐观锁操作系统互斥悲观锁
并发性能低竞争场景性能极高高竞争大量上下文切换,性能差
阻塞行为无线程阻塞,仅自旋重试竞争失败线程阻塞挂起
适用场景简单单一变量自增、计数复合多变量同步操作、复杂业务逻辑

11. 方法静态参数 static 传参 vs 实例方法传参

表格

对比维度静态方法 static实例普通方法
依赖资源仅能访问静态变量,无法使用实例字段可直接访问所有实例成员
调用方式类名。方法 (),无需 new 对象必须实例化对象才能调用
并发问题静态变量全局共享,极易并发错乱每个实例独立变量,天然隔离
内存生命周期类加载常驻内存,全局唯一随实例对象 GC 销毁

12. Spring @Resource vs @Autowired 依赖注入

表格

对比维度@Autowired (Spring 注解)@Resource (JSR-250 标准)
匹配规则默认按类型 byType 注入优先 byName 名称匹配,再 byType
多实例处理配合 @Qualifier 指定名称name 属性直接指定 bean 名称
标准规范Spring 框架专属,非 Java 标准Java 官方规范,兼容其他容器
必填校验required=true 默认必须存在找不到对应 bean 直接报错

13. StringBuilder append 拼接链式 vs 分段拼接

表格

对比维度链式连续 append多次分段 append 中间存临时变量
内存开销仅一个缓冲区,无临时字符串分段无额外开销,性能几乎无差异
可读性一行长链式,过长不易阅读拆分多行,逻辑清晰便于调试
扩容逻辑统一单次扩容判断多次 append 触发多次扩容校验
推荐写法简短拼接使用链式;超长文本拆分多行 append

14. 全局静态 Map 缓存 vs ThreadLocal 缓存

表格

对比维度static 全局 MapThreadLocal
数据隔离多线程共享,并发读写不安全线程数据完全隔离,无竞争
过期清理无自动过期,易内存泄漏线程池必须手动 remove 清理
存储内容全局公共配置、全线程共享数据单次请求线程私有临时数据
并发锁读写必须加锁控制并发无锁,天然线程安全

15. 递归分治 Stream vs 循环分批处理大数据

表格

对比维度Stream 递归处理循环分片分批处理
栈溢出风险数据量大递归深度过高 StackOverflow无递归,栈深度恒定安全
内存占用流式惰性求值,临时对象多分批处理及时释放,内存峰值低
代码简洁度流式一行完成逻辑循环模板代码量大,繁琐
线上稳定性超大集合禁止递归流式大数据分片循环为生产标准方案

16. equalsObjects 工具类 Objects.equals () vs 手动 == 判空再 equals

表格

对比维度Objects.equals(a,b)手动 if 判 null + equals
空指针安全内置 null 判断,任意 null 不报错漏写 null 判断直接 NPE
代码长度一行极简,无冗余 if 判断多行 if 分支,模板代码多
底层逻辑先判断地址相等,再判空,最后 equals重复手写相同逻辑,易出错
适用场景所有对象相等对比,生产统一规范不推荐手写判断,可读性差

17. 数据库主键自增 ID vs UUID 作为主键

表格

对比维度自增数字 IDUUID 字符串主键
索引性能数字主键索引紧凑,查询极快字符串索引体积大,性能衰减
分片分库分库分表会出现 ID 冲突全局唯一,多库无冲突问题
存储空间long 仅 8 字节UUID 占用 36 字符,空间消耗高
排序能力天然按插入顺序排序无序,无法根据主键排序数据

18. CompletableFuture exceptionally() vs whenComplete()

表格

对比维度exceptionally()whenComplete()
执行时机仅任务异常时执行正常 / 异常两种情况都会执行
返回值可返回兜底默认结果无返回值,仅做日志、资源清理
异常处理捕获异常并提供默认返回仅接收异常信息,无法修复结果
典型用途异常兜底返回默认数据统一打印成功 / 失败日志

19. 无界阻塞队列 LinkedBlockingQueue vs 有界 ArrayBlockingQueue

表格

对比维度无界 LinkedBlockingQueue有界 ArrayBlockingQueue
容量上限无固定上限,无限添加元素固定容量,满队列阻塞生产者
OOM 风险大量任务堆积直接内存溢出容量限制,可控内存峰值
锁分离读写双锁,并发吞吐量更高单锁,读写互斥,并发性能低
生产规范定时任务禁止无界队列业务线程池强制使用有界队列

20. Java 原生序列化 Serializable vs JSON 序列化

表格

对比维度Serializable 二进制序列化JSON 序列化 (Jackson/Fastjson)
跨语言仅 Java 语言可用,跨语言无法解析通用文本格式,支持所有语言
版本兼容字段增减极易反序列化失败兼容字段新增删除,容错性强
体积大小二进制体积更小,传输快文本体积更大,带宽消耗高
安全风险反序列化漏洞高危风险无原生反序列化漏洞,风险更低

21. 接口默认 default 方法 vs 抽象类公共实现方法

表格

对比维度接口 default 默认方法抽象类普通公共方法
多实现冲突多接口同名 default 必须子类重写单继承无方法冲突问题
成员变量无法访问实例变量,仅常量可直接使用子类实例字段
构造逻辑无构造方法,不能初始化状态拥有构造方法,可初始化公共属性
设计定位扩展接口兼容新版本抽取子类公共状态与逻辑

22. 单线程读取大文件逐行 vs 一次性加载全部到内存 List

表格

对比维度BufferedReader 逐行读取一次性读取全部存入 List
内存占用仅单行驻留内存,无 OOM 风险全量数据加载,大文件堆瞬间爆满
处理速度IO 频繁切换,略慢一次加载完成,内存处理速度快
适用文件GB 级超大日志、数据文件KB/MB 级小文件,总量可控

23. JVM SerialGC vs ParallelGC

表格

对比维度Serial 串行收集器Parallel 并行收集器
工作线程单线程执行所有 GC 动作多线程并行 GC,充分利用多核 CPU
STW 停顿单线程,停顿时间长多核并行,大幅缩短停顿时长
适用机器客户端、单核低配置程序服务端多核服务器,线上默认老收集器
吞吐量低,GC 占用大量 CPU 时间高,提升程序整体吞吐量

24. 包装类缓存 Integer.valueOf () vs new Integer ()

表格

对比维度Integer.valueOf(num)new Integer(num)
缓存复用-128~127 复用缓存对象,减少堆创建每次都新建全新堆对象,无复用
内存开销高频数字复用,降低 GC 压力大量重复数字生成大量对象
推荐规范业务统一使用 valueOf,禁止 new Integer仅特殊隔离场景手动 new
== 对比缓存区间内 == 相等,区间外 false任何数值两个 new 永远 ==false

25. 前置判断短路 && vs 位与 &

表格

对比维度短路逻辑 &&位运算逻辑 &
短路特性左边 false,右侧表达式不执行无论左侧真假,两边全部执行
使用场景条件判断 if 分支二进制位运算,掩码计算
性能差异可跳过无意义判断,性能更优两侧逻辑强制执行,存在无用计算

26. Spring 单例 Bean vs 多例 prototype Bean

表格

对比维度singleton 单例 (默认)prototype 多例
实例数量容器全局仅创建一个实例每次获取创建全新对象
并发安全实例共享,成员变量并发错乱每次全新对象,无并发竞争
内存占用常驻容器,长期占用堆使用后无引用快速 GC 回收
适用场景无状态工具类、Mapper、Service有状态、存储临时数据的 Bean

27. File 老式文件 API vs Path NIO2 API

表格

对比维度java.io.Filejava.nio.file.Path/Files
操作能力仅基础文件存在、删除、重命名复制、移动、权限、遍历目录、逐行读取
异常机制方法返回 true/false,失败无异常信息抛出详细 IO 异常,便于定位问题
符号链接无法识别软链接原生支持符号链接处理
代码简洁度大量冗余 try-catch,繁琐工具类 Files 一行完成复杂操作

28. Stream sorted () 有状态操作 vs filter 无状态操作

表格

对比维度sorted/distinct 有状态操作filter/map 无状态操作
并行流性能并行需要合并分片数据,开销巨大分片独立处理,并行效率极高
内存占用缓存全部元素完成排序,临时内存高逐个处理,无需缓存元素
底层逻辑必须收集全部元素再处理来一个处理一个,惰性无缓存
并行优化大数据并行排序收益极低纯计算并行大幅提速

29. 方法传参传递集合副本 vs 传递原集合引用

表格

对比维度传入集合拷贝副本直接传入原集合引用
外部影响外部修改原集合,方法内不受影响外部增删元素同步影响方法内逻辑
内存开销拷贝产生新集合,双倍内存占用仅传递引用,无额外内存开销
数据安全隔离外部数据,无并发修改异常外部线程并发修改会抛出异常
适用场景公共工具方法,防止外部篡改数据内部私有调用,数据不会外部修改

30. try-with-resources 单资源 vs 多资源声明

表格

对比维度单资源 try-with-resources多资源逗号分隔声明
关闭顺序资源执行完毕自动关闭声明逆序自动依次关闭所有资源
代码简洁度简洁直观一行声明多个流,无需多层嵌套
异常抑制仅单一关闭异常多个资源关闭异常全部保存为抑制异常
适用场景单一文件 / 连接流同时读写输入输出流、多连接同时释放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值