-
Collections.synchronizedList仅保证单方法线程安全,不解决复合操作、迭代并发及状态依赖问题;需手动同步迭代、避免底层暴露,锁粒度粗影响读性能,应依读写比例与一致性需求选替代方案。
-
Java中LocalDate.getDayOfWeek()返回ISO标准枚举(MONDAY=1至SUNDAY=7),但业务周统计需按自定义起始日(如周日或周三)映射为0~6偏移量,并借助WeekFields计算正确年周标识,避免硬编码和跨年错误。
-
非公平锁的lock()方法先通过CAS直接抢占锁,成功则立即持有,失败才入队;其核心是跳过队列检查、允许插队,吞吐量更高但可能引发饥饿。
-
因为现代应用多核高并发、短期对象增多,偏向锁的单线程优化假设失效,撤销需STW导致延迟抖动;实测禁用后99%延迟降5%-10%,且维护成本高、代码复杂易出错。
-
Java不支持变长后向否定预查,因其正则引擎要求后向预查必须固定长度;替代方案是先匹配再用Java逻辑过滤,或用负向先行断言结合字符类绕过限制。
-
ForkJoinTask是Java中用于高效并行计算的核心类,适合分治算法场景。通过继承RecursiveTask(有返回值)或RecursiveAction(无返回值),重写compute()方法实现任务拆分与执行,结合fork()异步提交、join()等待结果,利用ForkJoinPool的工作窃取机制提升多核性能,关键在于合理设置任务粒度以平衡拆分开销与并行效率。
-
VerifyError一出现即表明类加载失败,因为它是类加载链接阶段验证步骤的失败结果,发生在准备和初始化之前;JVM立即中止加载,不分配静态变量内存、不执行初始化,属于LinkageError子类,意味着类未通过字节码合法性校验。
-
需确保类定义一致并显式声明serialVersionUID;多对象应封装集合序列化;ClassNotFoundException需检查类路径;性能差时改用BufferedInputStream或Kryo等替代方案。
-
JavaString不可变,trim()仅处理ASCII空白;split()默认丢弃末尾空串,负limit才保留;substring索引需防越界;大量拼接用StringBuilder;Unicode补充字符需用codePoint相关方法。
-
Region是G1中逻辑分片而非连续内存块,大小1~32MB由JVM自动计算;每个Region可动态承担Eden、Survivor或Old角色,大对象存于HumongousRegion;RSet维护跨区引用以支持低延迟回收,但占用Non-heap内存且影响写屏障性能。
-
答案:基于用户行为的协同过滤通过计算用户间余弦相似度,找出相似用户并推荐其高分未读图书。例如,系统为Alice推荐Bob和Charlie评分较高的《深入理解计算机系统》,因二者与Alice阅读偏好相似且该书未被Alice评过分。
-
Java是纯面向对象语言,所有代码必须写在类中,无法实现纯面向过程编程;所谓“面向过程风格”仅是在类中用静态方法、无状态类线性组织逻辑,回避封装、继承、多态等OOP特性。
-
它靠,但不及时。Cleaner是JVM为DirectByteBuffer注册的“临终回调”,当对象被GC回收时触发Deallocator.run()并调用Unsafe.freeMemory();但因DirectByteBuffer堆内对象极小,常难触发GC,导致堆外内存回收滞后,存在泄漏风险。
-
Region管理堆是为了应对大内存、多核、低延迟场景下的根本矛盾:解决大堆停顿不可控、适配NUMA架构、支撑并发回收、灵活匹配对象生命周期异构性。
-
浅拷贝只复制对象本身及基本类型值,引用类型仅复制地址;深拷贝则递归复制整个对象图,确保完全独立。关键看是否允许共享状态:读取或全局配置用浅拷贝,并发修改、缓存备份等须用深拷贝。