-
构建金融级高精度数值计算类需用TextendsNumericValue约束泛型,确保所有类型统一实现toBigDecimal()等不可变操作;上界必须为自定义NumericValue接口而非Number,全程基于BigDecimal运算并显式指定舍入规则。
-
Collections.sort()配合自定义Comparator是最直接方式;需处理空值、越界及类型转换,如数值排序须将String转Integer/Double,升序用a.compareTo(b),降序用b.compareTo(a)或reverseOrder()。
-
抽象类适配器的核心是卸载接口全实现压力,让子类仅重写关心的方法,其余由抽象适配器空实现或提供默认逻辑;它必须abstract、implements接口、不实例化,适用于方法较多且子类只需部分功能的场景。
-
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。
-
应使用Callable接口结合Future和ExecutorService获取线程返回结果。1.Callable的call()方法可返回值并抛出异常;2.通过ExecutorService提交Callable任务获得Future对象,调用future.get()阻塞获取结果;3.可设置future.get(超时时间)避免无限等待,超时抛TimeoutException,任务异常封装为ExecutionException;4.可批量提交多个Callable任务,用List保存Future,遍历获取结果并汇总
-
LongAdder比AtomicLong快在高竞争下不卡住:它通过分段累加降低冲突,而AtomicLong的CAS自旋在多线程争抢时耗CPU;但低竞争时因分发开销反而略慢。
-
最安全通用的方式是用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且异于旧值时才异步推送;需先比对状态再包装,推送逻辑须异步且健壮,不适用于多条件决策或兜底场景。