-
编译器是否拦截是唯一判断标准:受检异常不处理则编译失败,运行时异常编译通过、运行才抛;关键看继承链是否经过RuntimeException,而非类名或发生时机。
-
JFR能每10ms采样线程栈,稳定捕获毫秒级抖动,而top仅显示整体CPU率、jstack为单次快照无法捕捉瞬时尖峰;必须用jcmd动态启动,关键事件包括jdk.ExecutionSample、jdk.JITCompilation、jdk.ThreadStart等。
-
ThreadLocal不能直接new使用,因其值与线程绑定且线程复用时不自动清理,易致数据错乱或内存泄漏;须staticfinal声明、显式remove()、避免存大对象,异步场景推荐TransmittableThreadLocal。
-
module-info.java是模块强制入口文件,须置于源码根目录且命名规范;exports解决包可见性,opens才支持反射访问私有成员;混用模块路径与类路径会生成不可控的自动模块。
-
JDK是运行和开发Java应用的必备环境,必须正确配置JAVA_HOME指向JDK根目录且PATH包含%JAVA_HOME%\bin(Windows)或$JAVA_HOME/bin(Linux/macOS),否则会出现命令未找到或类加载失败;验证需执行java-version、javac-version和echo命令确认版本与路径一致。
-
能,但必须严格控制匹配范围和统计周期,否则可能因字节码增强引入不可预期的开销;monitor通过ASM在方法入口/出口插入计数逻辑,虽不改业务代码,却增加指令执行与类重定义开销,高QPS下易抬升CPU。
-
Java多态核心是运行期动态绑定,依赖invokevirtual指令与虚方法表(vtable)实现:父类引用指向子类对象时,JVM根据实际类型查子类vtable调用重写方法;静态方法、private方法和成员变量不参与多态。
-
在Java中,捕获多个异常类型可以通过多种方式实现,让代码更简洁且易于维护。从Java7开始引入了更高效的语法来处理多个异常,下面介绍几种常用方法。使用多重catch块(Multi-catch)如果多个异常需要相同的处理逻辑,可以使用|(或运算符)将它们写在一个catch块中:try{intresult=10/Integer.parseInt("0");}catch(ArithmeticException|NumberFormatExceptione){
-
Git插件启用需系统安装git且IDEA正确配置路径;gitinit后项目未显示在LocalChanges中因.git不在项目根目录;Commit失败常因文件未暂存;Push认证失败须改用token或SSH。
-
Java模块化通过JPMS实现,以module-info.java定义模块的依赖与导出,提升大型项目的可维护性、封装性和性能,支持清晰的依赖管理与可扩展架构,尽管存在迁移成本与工具兼容挑战,建议新项目优先采用。
-
Thread.UncaughtExceptionHandler没生效的主因是子线程异常默认静默终止,且全局处理器被覆盖或未统一配置;需通过ThreadFactory为线程池预设handler,验证时主动抛异常并确保handler轻量无副作用。
-
exclusiveOwnerThread仅作用于单JVM内,无法跨节点传递或被Redis/ZooKeeper感知,故不能用于分布式锁所有权校验;真正有效的标识是全局唯一的clientID,需在加锁时写入、释放时通过Lua脚本严格比对。
-
CASEWHEN需规范书写:必须以END结尾、THEN返回值类型统一、ELSE不可省略;分简单型(值匹配)与搜索型(条件表达式);可嵌套及用于聚合统计;避免WHERE中滥用,GROUPBY/ORDERBY须用完整表达式。
-
BufferedStream不提升单次IO效率,仅减少系统调用次数;小数据量时因额外开销反而更慢,大块顺序读写且缓冲区合理(如64KB)才有收益,必须Flush/Dispose确保落盘,多数场景应优先选用StreamReader等高层封装。
-
可变参数方法使用...声明,支持直接传多个参数或数组,调用更灵活;数组参数需显式传数组。1.可变参数语法为String...args,数组参数为String[]args。2.可变参数可直接调用method("a","b"),数组参数需newString[]{"a","b"}。3.可变参数兼容数组传参,反之不行。4.重载时优先匹配固定参数方法,再匹配可变参数。5.可变参数是简化数组传参的语法糖,提升接口易用性。