-
使用JavaStreams将结果列表按success布尔值分区,保留失败项原始顺序,并将所有成功项合并为一条统一提示,适用于日志聚合、批量操作反馈等场景。
-
优先使用组合而非继承,仅在明确稳定的is-a关系且符合Liskov替换原则时才用继承;组合通过has-a关系实现灵活、解耦、可测试的复用,避免继承的强耦合与脆弱基类问题。
-
使用JSON序列化与文件IO实现日记持久化,通过BufferedReader/Writer读写文本文件,每篇日记以JSON格式存储并逐行解析;程序启动时加载文件内容反序列化为对象列表,结合Gson库完成数据转换;为提升可读性,设计标题居中、日期右对齐、正文自动换行及分隔线的格式化输出方案,确保信息清晰美观。
-
DirtyCardQueue背压是G1GC中跨Region写操作引发的性能瓶颈,表现为UpdateRS耗时升高、TPS下滑、MixedGC频繁但老年代存活率低;需结合G1ConcRefinementThreads与G1RSetUpdatingPauseTimePercent协同调优,并治理高频跨Region写模式。
-
Java动态规划是求解最优化问题的思想,核心为三步:定义状态、写状态转移方程、确定初始值与计算顺序,依赖最优子结构和重叠子问题两大特征。
-
64位HotSpot虚拟机中对象头默认占12字节,即8字节MarkWord(动态复用存储哈希码、锁状态、GC年龄等)加4字节压缩后的KlassPointer。
-
读取.xlsx文件必须用XSSFWorkbook而非HSSFWorkbook;getCell()返回null需先判空再取值;中文乱码、日期变数字、公式不计算分别需指定Locale、用DateUtil判断、主动求值;大文件应改用StreamingReader或SAX模式。
-
Java中成员变量分实例变量(每个对象独立,随对象创建初始化)和静态变量(类共享,类加载时初始化);方法需明确修饰符、返回类型和参数列表,static方法不能访问实例成员;封装要求成员变量私有、通过getter/setter控制访问。
-
只重写findClass而不重写loadClass,因为loadClass已实现双亲委派逻辑,直接重写会破坏委派导致ClassNotFoundException或LinkageError;findClass是安全钩子,负责定位字节码、读取为byte[]、调用defineClass定义类。
-
finalize()不是析构钩子而是GC负担,无调用保证且易致OOM;应禁用并改用Cleaner或try-with-resources。
-
扩容无需重算hash值,因容量恒为2的幂次方,新索引仅取决于原hash在新增bit位的值;JDK1.8用e.hash&oldCap快速提取该位,0则留原索引,非0则原索引+oldCap。
-
Java的Period.between方法在计算LocalDate间隔时采用“逐月递增+自动截断”策略,导致相同月份内不同起始日(如1月28日vs1月31日)可能得出完全相同的Period结果,这是其设计使然而非Bug。
-
泛型在编译期提供类型安全,通过类型参数提升代码复用性;定义泛型类如Box<T>后需指定具体类型如Box<String>来调用;泛型方法可自动推断类型,也可显式指定;由于类型擦除,无法直接实例化T,需借助Class对象或Supplier工厂;禁止创建泛型数组如newBox<String>[],建议用ArrayList替代;核心是编译期检查与合理使用通配符、边界。
-
在Spring应用中,若将AccountValidator等有状态对象通过new实例化,会导致其依赖不可见、难以测试和管理;正确做法是将其声明为Spring管理的Bean(如prototype作用域),并通过ObjectProvider按需获取,兼顾可测性、解耦性与生命周期可控性。
-
Collections.disjoint方法用于判断两个集合是否无交集,无交集返回true。它接收两个Collection类型参数,内部通过遍历较小集合并调用contains方法检查元素是否存在,因此性能受集合实现影响,建议至少一个为HashSet等高效contains结构。空集合与其他集合视为无交集,null则抛出NullPointerException。常用于权限校验、任务分配等需数据隔离的场景,使用时需注意集合类型选择以优化效率。