-
Java 25 的 ScopedValue 适合在明确的动态作用域内单向传递不可变上下文;ThreadLocal 仍适合可变的线程本地状态,但在线程池任务结束时必须 remove。本文用最小代码和选择表说明两者在任务边界、嵌套绑定和子任务继承上的区别。
-
Java 虚拟线程可以承载大量并发任务,但外部服务仍有容量上限。本文用 Semaphore 只限制下游调用区,并说明中断、等待超时、finally 释放以及连接池重复限流的边界。
-
Java Stream.toList() 返回的是不可修改 List,直接 add 会抛出 UnsupportedOperationException。本文对比 toList、Collectors.toList 和 toCollection(ArrayList::new),说明需要追加元素时的正确写法。
-
Java Optional 的 orElse 会先求值默认参数,orElseGet 则只在 Optional 为空时调用 Supplier。通过最小实验、参数求值规则和工程边界,快速判断两种写法。
-
Java 21 的 SequencedCollection.reversed() 返回反向顺序视图,不必先复制 ArrayList。本文用代码说明视图与快照的差异、修改可见性和并发遍历边界。
-
Java pattern matching for switch 遇到 null 时不会自动进入 default。本文用 case null 与 case null, default 对比说明匹配边界、合法组合和实际检查清单。
-
Java sealed interface 通过 permits 限制直接实现者,并要求它们用 final、sealed 或 non-sealed 明确后续扩展边界。本文结合层级、模块包约束和二进制兼容性说明如何正确设计。
-
Java record 接收接口 JSON 时,额外字段是否报错不由 record 单独决定,而由 Jackson 的未知属性策略决定。本文用最小示例说明局部注解、全局 ObjectMapper 和 ObjectReader 的边界,并给出上线前的兼容性检查清单。
-
Java 25 的 StructuredTaskScope 通过 fork、join 和 close 管理并发子任务:失败或超时可以取消同组任务,但子任务仍需正确响应中断,close 才能真正收口。
-
Java virtual thread 遇到 synchronized 后,锁等待、carrier 固定和平台线程阻塞很容易混为一谈。本文按 JDK 版本、JFR 事件和实际阻塞类型给出排查与修复路径。
-
Java 高并发统计计数优先考虑 LongAdder:它通过分散内部计数降低更新竞争,再用 sum 汇总;AtomicLong 则更适合序列号、额度和需要原子读改写的精确状态。本文对比两者的吞吐、读取、重置和迁移边界。
-
FileChannel.map 不是把整个文件装进 Java 堆。处理超大文件时应使用固定窗口、限制活跃映射数量,并处理跨窗口记录;Java 22+ 还可用 MemorySegment 和 Arena 管理生命周期。
-
Files.walk 的 maxDepth 从起始 Path 的深度 0 开始,所以当前目录始终会出现在结果中。本文用层级示例讲清深度、过滤、资源关闭和 API 选择。
-
Java Pattern 的 UNICODE_CHARACTER_CLASS 只负责让 \d、\s、\w 等预定义字符类采用 Unicode 语义;如果规则只针对字母、脚本或数字属性,可直接使用 \p{...}。本文用边界样例说明如何选择编译标志,避免正则匹配范围意外放大。
-
Java sealed interface 扩展失败时,先检查 permits 中的类型是否可访问且确实直接 implements 或 extends 该接口,再核对 final、sealed、non-sealed 续封修饰符,最后区分 named module 与 unnamed module 的包边界。本文用最小编译矩阵逐项定位这些错误。