-
Java简单搜索应优先用ArrayList/HashMap配合stream().filter()实现内存模糊匹配,TreeSet结合subSet()支持大小写不敏感前缀搜索,需预处理null和空值并避免无效搜索。
-
select()方法会阻塞线程直至有就绪通道、被唤醒、超时或中断,返回就绪键数量,需循环调用并手动清理selectedKeys集合。
-
CopyOnWriteArrayList适用于读多写少场景,通过写时复制实现线程安全,读操作无锁并发,迭代基于快照不抛异常,适合配置列表、监听器等数据变动少且需高性能读取的并发环境。
-
为什么Caffeine的get方法默认不阻塞写入因为Caffeine把“缓存未命中+异步加载”和“同步计算+阻塞等待”做了明确分离。它默认走的是get(key,mappingFunction)这条路径,而这个方法在key不存在时,会用你传的mappingFunction同步计算值并写入,**期间其他线程对同一key的get调用会各自触发计算,不共享loading过程**——也就是常说的“缓存击穿”风险点。常见错误现象:get(key,()->heav
-
SonarQube报告“未在finally中关闭ObjectInputStream”并非误报:当外层流(如FileInputStream)关闭时抛出异常,内层流(ObjectInputStream)将被跳过关闭,导致资源泄漏。本文详解兼容旧Java版本的安全关闭模式。
-
Springfox3.x在SpringBoot2.6+需配置spring.mvc.throw-exception-if-no-handler-found:false且spring.resources.add-mappings:true,访问路径为/swagger-ui/;SpringBoot3.x不兼容Springfox,须迁移到springdoc-openapi。
-
静态代码块不适合放耗时操作,因其在JVM类初始化阶段单线程阻塞执行,失败会导致ExceptionInInitializerError使类不可用;应改用静态内部类懒加载、@PostConstruct或SpringBean生命周期管理。
-
TIME_WAIT是TCP必要机制,端口耗尽主因是短连接QPS超临时端口回收能力;需查ip_local_port_range与ss-s中tw值是否接近上限,并以“cannotassignrequestedaddress”为铁证,而非仅看TIME_WAIT数量。
-
DirtyCardQueue背压是G1GC中跨Region写操作引发的性能瓶颈,表现为UpdateRS耗时升高、TPS下滑、MixedGC频繁但老年代存活率低;需结合G1ConcRefinementThreads与G1RSetUpdatingPauseTimePercent协同调优,并治理高频跨Region写模式。
-
ForkJoinPool适用于天然可分的递归任务(如数组求和、树遍历),依赖工作窃取提升效率;应优先使用commonPool(),合理设置拆分阈值,避免用于非递归或阻塞型任务。
-
接口更灵活因其分离“做什么”与“怎么做”,调用方仅依赖行为契约;实现可替换(如MySQL/MongoDB/Mock)、测试易模拟、编译期解耦;需注意实现方法必须public、多default方法须显式重写;非所有场景都需接口,应聚焦可变点。
-
多线程高频生成随机数且无需可重现序列时应优先用ThreadLocalRandom;它为每线程提供独立实例避免同步开销,而Random适用于需固定种子复现序列的场景。
-
编译错误是javac编译阶段因语法或类型问题导致无法生成.class文件;运行错误是程序执行中触发RuntimeException而崩溃;逻辑错误是代码无异常但结果不符合预期。
-
Java17+模块化项目必须显式声明module-info.java,否则触发模块校验导致NoClassDefFoundError等错误;需正确放置路径、配置模块名、声明依赖与导出,并使用--module-path启动。
-
StreamAPI是声明式、不可变、支持并行的数据处理抽象,不修改原集合、不存储数据,仅描述操作;适合一次性链式转换、中等数据量、需延迟或并行场景,不适合反复遍历、极简操作、极致性能或需break/continue的场景。