-
Collections.disjoint采用短路逻辑遍历小集合并调用大集合的contains,不构造中间交集,最坏时间复杂度O(m×n),但平均优于先求交集再判空;要求集合非null,支持不可变集合;使用前需判空,性能敏感场景下通常无需替换,底层实现比方法选择更重要。
-
答案:基于用户行为的协同过滤通过计算用户间余弦相似度,找出相似用户并推荐其高分未读图书。例如,系统为Alice推荐Bob和Charlie评分较高的《深入理解计算机系统》,因二者与Alice阅读偏好相似且该书未被Alice评过分。
-
BitSet比boolean[]省内存因用1bit存布尔值,而boolean[]按字节对齐致空间放大8倍;适合稀疏布尔标记,但get/set略慢、不支持泛型;底层为long[],扩容翻倍,初始化建议预设大小;遍历用nextSetBit()高效跳零;跨系统需注意字节序与padding。
-
Java中括号匹配与中缀转后缀均依赖栈的LIFO特性:括号匹配通过入栈左括号、遇右括号校验并弹出实现;ShuntingYard算法依运算符优先级控制入栈/弹出,生成后缀表达式;后缀求值则用栈执行数字入栈、运算符弹双操作数计算。
-
并发编程核心难点在于可见性、原子性、重排序、竞态条件、中断响应与死锁的综合处理:volatile解决可见性但不保原子性,synchronized和Lock兼顾二者却有开销,CAS类操作需谨慎使用,组合操作须额外同步,中断依赖线程主动响应,死锁源于锁序不一致,而“何时加锁、加多大”才是最易出错的边界问题。
-
volatile通过内存屏障强制读写主内存,解决多线程可见性问题;但不保证原子性,仅适用于状态标志等简单场景。
-
正确使用wait()和notify()需在synchronized块中调用,用while循环检查条件并及时通知,避免死锁与竞争。
-
核心是构建严格锚定、分段清晰、边界明确的正则表达式:以^TEST_PROCESS_[a-z]+(?:_PRODUCT(?:_NEW)?)?$确保仅匹配合法形式,排除双下划线、大小写混用、前缀错误等所有非法变体。
-
SpringMVC通过@ControllerAdvice和@ExceptionHandler实现基于注解的全局异常处理,支持统一响应格式、状态码映射与日志记录,优先级高于默认错误页,需确保类被Spring扫描且兼容异步场景。
-
Gson默认跳过Map中null值,需调用serializeNulls()才能输出null;Jackson对LinkedHashMap顺序无稳定保证,须确保使用LinkedHashMap实例且避免破坏顺序的操作;FastJson2反序列化泛型需TypeReference匿名子类,否则类型擦除导致嵌套LinkedHashMap。
-
自研监控系统通过方法注解+反射提取业务“指纹”,即自动结构化关键方法的执行特征(方法名、参数、耗时、异常、调用链上下文)为可采集标识数据;一、定义RUNTIME级@BizFingerprint注解声明监控意图;二、反射提取器抓取方法签名、参数快照、耗时、状态及traceId等构造指纹POJO;三、双通道上报:指标维度分组统计QPS/P99/错误率,事件维度发完整JSON至Kafka/OTel;四、避坑:用getDeclaredAnnotations、禁存大对象、参数序列化前校验循环引用、高并发下用对象池。
-
MongoDB单文档硬性限制为16MB,超限文档无法直接写入;本文介绍一种兼顾合规性、查询灵活性与工程简洁性的方案——结合GridFS存储原始大文件+元数据独立建模,实现在同一逻辑业务场景下无缝支持聚合、排序与关联查询。
-
静态成员属于类本身而非实例,JVM在类初始化阶段为其分配唯一内存,所有实例共享;调用不依赖对象,由声明类型决定隐藏行为,与对象无关。
-
Java接口默认方法是Java8引入的用default关键字定义的非抽象方法,可在不修改已有实现类的前提下为接口新增功能,如List的sort()方法;它必须加default修饰,仅支持public或包访问,不可被final修饰,不能访问实现类实例字段。
-
继承通过extends实现,子类复用父类非私有成员,构造器需调用super(),Java不支持多继承;合理使用@Override重写方法,遵循LSP原则,优先组合而非继承以降低耦合。