java教程技术文章
-
用 Java NIO FileChannel、临时文件和 checkpoint 实现可恢复的大文件复制,处理短传输、force、源文件变化与最终替换。157 收藏 -
Files.walk 返回的 Stream可能持有打开目录,遍历结束不代表资源已经及时释放。本文说明显式关闭的原因、正确写法,以及 IOException 与 UncheckedIOException 的处理边界。 373 收藏 -
Java Stream 使用 groupingBy 分组时,想让结果按输入中键第一次出现的顺序遍历,应指定 LinkedHashMap::new;同时要区分外层 Map 键顺序、组内 List 顺序,以及并行流和 TreeMap 的不同语义。366 收藏 -
Java 虚拟线程适合承载阻塞 IO,但不应拿固定线程池限制资源并发。本文用 Semaphore 配合虚拟线程执行器,说明如何按连接池、上游限额和 CPU 预算设置可观察的并发边界。415 收藏 -
Java 多字段排序不要在比较器里直接调用可能为空字段的 compareTo。用 nullsFirst 或 nullsLast 包住每个字段的 Comparator,再用 comparing 和 thenComparing 组合;降序时只反转非空值顺序,避免 null 被一起翻到前面。310 收藏 -
Java HttpClient 复用同一个客户端,并分别设置连接建立超时与单次请求超时;通过异常类型和响应状态码快速定位网络、响应或业务问题。351 收藏 -
Java 读取大文件时,优先用 Files.lines 惰性产生 Stream,显式指定字符集,并用 try-with-resources 关闭文件流,避免一次性加载和资源泄漏。 311 收藏 -
Java 线程池会复用工作线程,ThreadLocal 中的用户信息不会在一次任务结束后自动消失。本文用 finally、remove 和任务装饰器建立可靠的清理边界,避免用户串号与对象滞留。188 收藏 -
Java record 的 List 仍能修改,是因为 final 只固定集合引用而不冻结集合内容。本文用引用链说明原因,并比较直接保存、只读视图与 List.copyOf 快照的适用场景。136 收藏 -
Java try-with-resources 中,主体代码和 close() 同时抛异常时,主体异常继续向外传播,关闭异常会被保存到 suppressed 列表。本文用一个可复用的排查场景说明关闭顺序、异常主次与 getSuppressed() 的读取方式。116 收藏 -
List调用 remove(1) 时,Java 会优先匹配 remove(int),删除下标为 1 的元素;如果要按值删除整数,应显式使用 Integer.valueOf(1)。本文再补充 removeIf、不可修改列表和 subList 的边界。 114 收藏 -
Java Optional 的 orElse 会先计算默认参数,所以即使 Optional 有值,默认方法也可能执行。本文用最小示例解释 orElse 与 orElseGet 的求值时机和选择边界。382 收藏 -
LocalDateTime 不包含时区,不能单独确定时间戳。本文用 ZoneId、ZonedDateTime 和 Instant 演示秒级、毫秒级转换,并说明夏令时、固定偏移和精度损失。443 收藏 -
用 CompletableFuture.allOf 等待并行任务,再用 handle 把成功值和失败原因统一成结果对象,最后按原顺序收集,避免一个异常吞掉其他已完成结果。452 收藏 -
Java BigDecimal 的 2.0 与 2.00 数值相同但 equals 返回 false,是因为 equals 同时比较数值和 scale。本文用代码说明 compareTo、setScale、stripTrailingZeros 与集合键的选择边界。456 收藏