-
虚拟线程调用read()、sleep()等白名单阻塞方法时,JVM在字节码层面直接介入挂起:保存栈帧、释放载体线程、标记为WAITING并移出队列;非白名单操作(如native方法、CPU循环)无法触发挂起。
-
JDK工具是Java开发的核心命令行工具集,位于bin目录下,包括javac编译、java运行、javadoc生成文档、jar打包及jconsole、jstat等监控诊断工具,贯穿开发、调试、部署全流程,提升效率、保障质量、优化性能,是深入理解Java运行机制和进行系统调优的基础。
-
工厂模式通过封装对象创建过程,降低耦合并集中管理实例生成,适用于需动态创建不同对象或初始化逻辑复杂的场景。例如根据不同数据库、支付方式或文件格式选择具体实现类时,工厂可统一返回对应实例;新增类型只需修改工厂,无需改动调用方。同时能简化复杂初始化,如配置读取、依赖注入和参数校验,并支持静态方法提升语义清晰度,如Color.createRed()或Response.success(data)。结合配置文件或环境变量,工厂还能实现运行时灵活切换实现类,支持多环境部署与插件式扩展。本质上是将“new”变得智能可控
-
PriorityQueue在offer()插入新元素且底层数组已满时才触发扩容,扩容规则为:旧容量<64时新容量=2×old+2,≥64时为1.5×old;不支持缩容,也无trimToSize()方法。
-
能,抽象类可以且经常需要写构造方法;因为子类实例化时必须调用抽象父类构造方法以初始化父类状态,确保字段非默认值,并遵循JVM自上而下的构造链。
-
finally在System.exit、致命错误、Thread.stop()、kill-9时完全不执行;finally中return会无条件覆盖try/catch的返回值;try-with-resources比手动finally更可靠,因编译器自动处理异常抑制且无需判空。
-
Java集合对null支持不统一:HashMap等宽松派允许null,TreeMap等严格派因排序或并发歧义禁止null;Stream需filter或Optional处理null;推荐用emptyList、Optional、枚举替代null。
-
接口应按调用方角色而非功能模块拆分,如LoginCapable、EmailCapable、ReportCapable;若实现类超1/3方法为空或抛异常,即违反接口分离原则,需及时重构。
-
异常信息必须包含上下文,不能只抛newRuntimeException("出错");应拼入关键变量、状态或输入值,并用带cause的构造函数保留原始堆栈;日志级别需匹配异常性质,WARN用于业务校验失败,ERROR用于系统级故障。
-
自动装箱拆箱是编译器在int与Integer间隐式转换的机制,提升泛型集合使用便利性,但带来缓存陷阱、空指针和性能开销问题,需谨慎处理判等、空值及Stream链式调用。
-
ConcurrentHashMap通过分段锁(JDK7)或CAS+synchronized(JDK8+)解决HashMap的线程不安全问题,支持高并发读写,避免ConcurrentModificationException、数据丢失和死循环。
-
最可靠方式是通过字节码分析Lambda运行机制:invokedynamic仅为占位符,实际逻辑由LambdaMetafactory引导方法和动态生成的$$Lambda类执行,其对应静态或实例方法可通过javap验证,动态类名在运行时生成且不可直接加载。
-
default方法不能访问实现类私有字段或独有方法,只能调用接口已声明的抽象方法和其他default方法;可通过新增抽象方法暴露状态,构建契约化行为骨架。
-
RESTfulAPI中应使用Optional.ofNullable().orElseThrow()处理“本应存在却缺失”的业务空值,配合@RestControllerAdvice统一返回标准错误响应,避免null或默认值;非业务空场景(如分页无数据)应返回200空列表。
-
启用-XX:+PrintGCDetails后,GC日志中直接反映晋升行为的关键字段是:tenuringthreshold(显示为newthreshold)、survivor容量与使用量、oldgen增量,以及PSYoungGen存活大小变化;其中newthreshold值动态体现实际晋升年龄门槛,oldgen增量与年轻代存活量差值可量化晋升字节数,Survivor区饱和时newthreshold陡降或归零即表明强制晋升启动。