-
Java版本怎么选:OpenJDK还是OracleJDK?容器里别用OracleJDK,授权和体积都是坑。DockerHub上官方openjdk镜像已覆盖主流版本(11/17/21),直接拉取即可。JDK17是当前LTS中兼容性、GC行为最稳的选择,除非项目强依赖JDK8的javax.xml.bind等废弃包——那种情况得加--add-modulesjava.xml.bind启动参数,但更建议升级代码。生产环境优先用openjdk:17-jre-slim,比-jdk少装编译工具,镜像小3
-
Java7多异常捕获需满足互不相关的已检查或运行时异常、用|分隔、e为最近公共父类;不支持父子类异常合并;无法直接调用子类特有方法,需instanceof判断;性能与多个catch无差异;适用于处理逻辑完全一致的场景。
-
OutputStreamWriter的核心作用是将字符按指定编码转换为字节并写入底层字节流,作为字符流与字节流间的编码桥梁;必须包装现有OutputStream,需显式指定编码(如UTF-8),写入后应flush或close,可配置错误处理策略。
-
默认返回HashMap,不保证顺序;需有序用LinkedHashMap::new;多字段分组推荐record组合键;统计数量用counting();key为null直接抛NPE,须提前处理。
-
泛型是编译期类型契约而非语法糖,应在逻辑相同但数据类型不同的场景定义泛型类,优先使用泛型方法;需合理约束T,避免过度约束与擦除陷阱,并正确运用协变/逆变。
-
增强for循环底层基于Iterator实现,编译后转为hasNext()和next()调用;遍历时修改集合结构会抛ConcurrentModificationException;安全删除须用iterator.remove()且需在next()后调用;ArrayList的Iterator性能优于LinkedList;CopyOnWriteArrayList不支持remove();自定义集合需正确实现Iterable与Iterator。
-
Serial收集器仅适用于资源受限且延迟不敏感的轻量级场景,如嵌入式设备(≤128MB堆、单核)、命令行工具、CI/CD临时Java任务、教学演示;需显式启用-XX:+UseSerialGC,禁用于线上服务,因其单线程STW无法伸缩。
-
非受检异常应以预防为主、精准响应、合理封装,多数情况下不建议业务层随意捕获;需通过主动校验、自定义业务异常、全局日志监控等手段提升健壮性。
-
EnumMap底层是基于枚举ordinal()的Object[]数组,O(1)访问无哈希开销;不允许nullkey,泛型强制KextendsEnum<K>;空间固定、遍历有序、性能优于HashMap,适用于封闭枚举场景。
-
访问数组前需检查索引合法性,通过判断索引是否在0到数组长度范围内避免越界;2.使用增强for循环可规避手动控制索引带来的风险;3.封装安全访问方法,在越界时返回默认值提升健壮性;4.Java8+推荐使用Optional封装元素,支持函数式处理空值情况。核心是“先判断后访问”,杜绝依赖异常控制流程。
-
Java批量重命名应使用Files.move()替代renameTo(),按策略生成新名并校验冲突;需过滤文件、保留扩展名、避免覆盖、处理异常并支持预览模式。
-
本文详解Java中使用Math.abs()处理Integer.MIN_VALUE时的整数溢出问题,并提供不依赖乘除模运算的安全整数除法实现方法。
-
LEFTJOIN更安全是因为它能保留所有一级评论(parent_idISNULL的根节点),而INNERJOIN会过滤掉无子评论的根节点,导致前端漏渲染;实际需用别名r1/r2避免字段歧义,且无限层级需结合Java递归与深度限制。
-
调试时发现方法返回正确值,但接收变量仍为初始值(如空字符串),根本原因常是调试器在多线程切换中丢失执行上下文——变量确已赋值,但后续异步线程读取的是旧快照或未同步的副本。
-
VarHandle在内存访问层面比AtomicFieldUpdater更高效,因其绕开反射、精准生成内存屏障、避免运行时校验、直接映射硬件指令且缓存行友好性更高。