-
ThreadLocalMap.Entry用弱引用是为了避免ThreadLocal实例被长期持有导致内存泄漏,而非自动清理;弱引用仅作用于key,value仍为强引用,需配合remove()或set()/get()触发的探测清理机制防止staleentry泄漏。
-
不靠。String.matches()仅能粗筛,因正则简陋、未校验DNS/MX,且易受null、性能、转义等问题影响;需配合判空、预编译Pattern、InternetAddress解析、确认邮件及trim等多重校验。
-
查单条且必须存在时用selectOne,否则优先用selectList;输入统一用nextLine()再转类型;UPDATE/DELETE必须检查WHERE条件和参数名;tinyint(1)映射Boolean需配typeHandler或用Integer判断。
-
本文介绍在使用SnakeYAML处理含锚点(&id)和别名(*id)的YAML配置文件时,因自引用导致构造Configuration对象时发生无限循环的问题,并提供安全、健壮的递归解析方案。
-
企业级项目应优先使用定制化线程池而非newThread()或简单Runnable,因其支持资源复用、任务解耦、异常统一处理、监控指标暴露及业务域隔离,符合稳定性、可观测性与可维护性要求。
-
CompletableFuture是Java异步编程核心工具,支持非阻塞任务执行与组合;通过supplyAsync/runAsync创建异步任务,默认使用ForkJoinPool.commonPool(),建议生产环境用自定义线程池;thenApply实现同步转换,thenCompose用于链式依赖调用;thenCombine合并两个任务结果,allOf等待多个任务完成;exceptionally处理异常并返回默认值,handle统一处理结果与异常,whenComplete执行副作用如日志;掌握这些方法可
-
继承使子类编译期获得父类非私有成员,支持运行时多态;但易致紧耦合,应优先组合与接口实现,仅当满足稳定“is-a”关系时使用。
-
Java密封类需用permits显式列出所有子类,子类须在同一编译单元中声明并用final/sealed/non-sealed修饰;non-sealed用于开放特定分支继承;switch匹配时要求穷尽所有permits子类或含default。
-
Java普通方法调用开销大,需保存PC、压栈、传参、跳转、执行、弹栈、恢复上下文;add(inta,intb)类方法调用开销常超总耗时60%,虚方法因查vtable等更慢。
-
ReadWriteLock通过分离读写锁提升并发性能,允许多线程并发读、写操作独占,适用于读多写少场景;使用ReentrantReadWriteLock时需注意锁配对释放、避免读锁升级写锁、合理选择公平模式,并在高并发下考虑StampedLock优化。
-
Error和Exception均继承自Throwable,但Error表示系统级无法恢复的严重问题,如内存溢出,程序通常不应捕获;Exception表示可处理的异常,分为编译器强制处理的检查异常(如IOException)和运行时异常(如NullPointerException),可通过try-catch或throws恢复执行,正确区分二者有助于提升程序健壮性。
-
抽象类是不能被实例化的类,用于定义通用行为框架,具体类继承抽象类并实现其抽象方法。示例中Shape为抽象类,包含抽象方法calculateArea()和具体方法displayInfo();Rectangle和Circle为具体类,分别实现calculateArea()。通过父类引用调用子类对象,实现多态。抽象类支持代码复用、结构统一和强制实现关键逻辑,适用于具有“is-a”关系的类体系。一个类只能单继承抽象类,若子类未实现全部抽象方法则必须声明为抽象类。正确使用抽象类可提升代码可维护性、扩展性和复用性。
-
Thread.sleep让兔子“睡过头”是因为它粗暴暂停线程且不释放锁,若写在循环开头则每轮固定休眠,无法模拟随机懒惰;应改用Random生成波动休眠时间,并避免在synchronized块中调用。
-
MyBatis一级缓存默认开启且仅限单个SqlSession内生效,重复查询相同语句直接返回缓存结果;但无法感知其他SqlSession的数据库变更,存在数据不一致风险,需谨慎使用。
-
重量级锁是线程被操作系统挂起并用MutexLock排队的锁机制,触发用户态到内核态切换,开销达数百纳秒至微秒级;表现为jstack中大量BLOCKED线程停在ObjectMonitor::enter或park,且CPU低、吞吐骤降。