-
Java内存模型(JMM)是定义volatile、synchronized、final等关键字在多线程下如何约束读写、可见性与重排序的抽象规范,不描述内存布局,也不解决“怎么写”,只决定“如何执行”。
-
DelayQueue是Java中基于优先级队列实现的无界阻塞队列,用于存放实现Delayed接口的对象,只有当对象延迟时间到达后才能被取出,适用于延迟任务调度场景。其元素按延迟时间排序,支持线程安全操作,常用于定时清理缓存、发送通知等。使用时需注意系统时间敏感性、任务阻塞影响、内存溢出风险及精度限制,建议结合线程池异步处理任务以提升效率。
-
三元运算符要求两分支表达式类型一致,否则隐式提升可能导致精度丢失或警告;应主动控制类型一致性,如显式强制转换、统一使用包装类、提取为同类型变量,并启用编译器严格检查。
-
==比较对象引用是否相同(内存地址),equals比较逻辑内容是否相等;String等类重写了equals以比较字符序列,而==在字符串常量池与new创建对象时结果不可靠。
-
newBigDecimal(0.1)不等于0.1,因为double的二进制浮点表示导致0.1存储为近似值0.10000000000000000555…,BigDecimal(String)或BigDecimal.valueOf()才能精确构造。
-
安全捕获异常关键变量需在异常发生现场提取:优先用自定义异常构造参数传入业务ID;避免反射、toString()等高危操作;集合只记size和前3元素;时间转ISO格式;MDC存简单类型上下文并及时清理。
-
@SneakyThrows是编译期字节码增强,不改变异常模型,仅自动插入try-catch并抛出RuntimeException;调用方仍需处理异常,且IDE不提示throws,易致运行时崩溃与排查困难。
-
设计Java类继承应明确“is-a”关系,优先使用抽象类或接口定义契约,避免过深继承层级,建议不超过三层,多用组合替代继承以提升灵活性;遵循里氏替换原则,确保子类可安全替换父类,不改变程序正确性;合理使用protected和final控制访问与扩展,父类不应被实例化时声明为abstract;核心是围绕领域模型设计,确认子类确实是父类的一种,再使用继承实现多态与接口统一。
-
本文详解SpringBoot中因误用双大括号初始化(DoubleBraceInitialization)创建匿名子类,导致JPA无法识别实体类而抛出InvalidDataAccessApiUsageException:XXXisnotanentity的典型问题及彻底解决方案。
-
浅克隆复制对象但共享引用,适用于简单结构或性能优先场景;深克隆递归复制所有引用对象,适用于需完全隔离的可变复杂结构,选择依据是是否允许引用共享。
-
Spring无法直接注入抽象类,因为抽象类不能实例化;应通过具体实现类(如AServiceImpl)注入,或改用接口定义契约并让实现类注册为Bean。
-
生产环境JVM堆内存参数应设为-Xms与-Xmx相等以避免动态调整引发FullGC;容器化需启用-XX:+UseContainerSupport并用-XX:MaxRAMPercentage替代硬编码-Xmx;元空间须显式设置-XX:MetaspaceSize和-XX:MaxMetaspaceSize。
-
String.join最快最直接但要求List及元素均非null;Collectors.joining更灵活可链式处理但有Stream开销;高频或大数据量时手写循环性能更优。
-
Java数组的length是编译期确定的final字段而非方法,因数组为JVM内置类型,大小固定且存于对象头中;调用length()、对null数组访问或混淆List.size()均会报错。
-
在SpringMVC中,可通过为@RequestParam添加required=false属性,使其变为可选参数;当请求未携带该参数时,其值将为null(或通过defaultValue指定默认值),从而避免400BadRequest错误。