-
ServiceLoader.load不能用于运行时确定类型的“变量接口”,因其要求接口类型编译期已知;若需按字符串名动态加载,须绕过泛型限制、显式指定类加载器并手动校验类型,或改用SpringFactories等更灵活方案。
-
Java集合框架不支持原始类型,需装箱导致CPU和GC开销;FastUtil通过数组直存原始值解决,且持续维护、支持64位、接口兼容、功能丰富,实测显著提升性能与内存效率。
-
Math.expm1(x)是计算eˣ−1的高精度函数,专为x接近0时避免数值消去而设计;例如x=1e-16时,Math.exp(x)-1返回0而Math.expm1(x)正确返回约1e-16。
-
Java应用日志目录由日志框架(如Logback、Log4j2)配置决定,非JDK控制;需在配置文件中设置路径变量(如LOG_PATH),注意权限、相对路径基准(进程工作目录)、跨平台兼容性及目录自动创建能力。
-
最常用方法是调用目标列表的addAll(),将源列表元素追加到可变目标列表末尾,不改变源列表;需注意目标列表必须可变,否则抛UnsupportedOperationException。
-
最安全通用的方式是用Collection.toArray(T[])方法;无参toArray()返回Object[],强转泛型数组会因泛型擦除和JVM类型检查导致ClassCastException,正确写法为list.toArray(newString[0])。
-
不能在for-each循环中调用list.remove(),因为会触发ConcurrentModificationException;必须使用Iterator.remove()(需先调next())或Java8的removeIf()。
-
异常不应用于流程控制,因其触发栈帧展开、抑制JIT优化,性能下降3–10倍;IO失败应区分可恢复场景(默认值+warn)与契约破坏;并发中锁内抛异常易致状态不一致;日志必须打印完整堆栈。
-
Disruptor不是队列而是环形数组+序列号驱动的状态机,需按其内存模型组织代码:bufferSize必须为2的幂次方,事件类须有无参构造器和reset方法,生产者须批量申请序列号并publish,消费者须用BatchEventProcessor与BusySpinWaitStrategy,且必须解决伪共享问题。
-
规则引擎负责解析条件、维护上下文、执行判定;线程池仅异步执行封装好的原子任务,不参与规则建模。多维判定拆为独立RuleTask,并行计算,调度器基于DAG编排短路逻辑,需隔离线程池、变量快照与带元信息结果归集。
-
Java的try-with-resources能自动关闭资源,前提是资源实现AutoCloseable接口;资源在try后括号内声明,执行结束时自动调用close()方法;关闭顺序与声明顺序相反;若try块和close均抛异常,try异常为主,close异常被压制并可通过getSuppressed()获取。
-
Optional.ifPresent()是空安全的触发开关,仅当新值非null且异于旧值时才异步推送;需先比对状态再包装,推送逻辑须异步且健壮,不适用于多条件决策或兜底场景。
-
Java对象序列化版本演进需通过DTO分离契约、Jackson兼容机制、实体扩展预留、密封类约束四层设计实现兼容性可预期;核心是接口+DTO隔离、字段增删改容错、extensions动态扩展、sealedclass版本管控。
-
Integer.toBinaryString()对负数返回32位补码二进制字符串(如-1→32个1),不带符号位、不补前导零;正数返回最简二进制形式(如5→"101"),0返回"0";需带符号或固定位宽时须手动处理。
-
Java规范未规定匿名类编号的生成规则,不同编译器(如javac与EclipseJDT)对同一匿名类可能生成不同数字后缀(如Foo$1vsFoo$6),因此依赖getClass().getName()作为持久化标识会导致兼容性问题。