-
DCL单例不加volatile不是线程安全的,因对象构造可能被重排序,导致其他线程看到未初始化完成的实例;必须用volatile禁止重排序并保证可见性。
-
Double.isInfinite()仅能检测已产生的无穷大结果,无法预防除零问题;因浮点除零不抛异常,但后续用Infinity或NaN易引发隐性错误,故须在除法前校验除数是否为零。
-
学生类和课程类应作为独立实体设计,通过Enrollment关系类建模多对多关联;ID统一用String;选课需校验存在性、重复性、容量等;退课与查询应维护courseToStudents、studentToCourses等内存索引以实现O(1)操作。
-
线程池用于处理WebSocket连接背后的耗时业务逻辑,而非I/O操作;I/O必须由事件驱动框架原生处理,业务逻辑(如数据库查询、AI调用)才应交由线程池异步执行。
-
继承层次过深导致可读性差、维护困难、耦合度高,修改父类易引发副作用;主要弊端包括维护成本上升、依赖过强、重写风险增加和扩展受限;应优先使用组合替代继承,将“是一个”变为“有一个”,通过接口或抽象类定义行为,由独立组件实现并委托调用,提升复用性与灵活性;通用逻辑应提取至工具类或服务,避免污染继承链;利用Java8接口默认方法实现横向功能扩展,降低对单一继承体系的依赖;合理控制继承深度,多用组合、接口与委托,增强系统健壮性与可扩展性。
-
Collectors.toMap本身不支持动态过滤,需先用Stream.filter()筛选未过期的Key再收集;若存在重复ID,须指定merge函数避免异常;禁止在mapper中返回null或用Optional试图跳过,应恪守filter负责筛选、toMap负责映射的职责分离原则。
-
MetaspaceOOM前必先频繁扩容并触发FullGC,关键看GC日志中Metaspace使用量回落极少(如10240K→10240K)且Classesunloaded长期为0,结合-XX:+PrintClassLoaderStatistics确认类加载器与类数量持续增长,表明动态代理或类加载器泄漏导致卸载失效。
-
Character.isWhitespace()不能用于正则表达式中清理控制字符,因其仅判断单个字符是否为空白(如空格、换行等),不识别\u0000–\u001F等需清除的Unicode控制符;推荐直接用replaceAll("\\p{Cntrl}","")或更精确范围[\u0000-\u001F\u007F]。
-
答案:while循环在条件为真时重复执行代码块,需确保循环变量更新以避免死循环。示例中用i从1到5打印数字,循环体每次递增i;若忽略更新则导致无限循环。实际用于读取输入、处理数据流等场景,如持续接收用户命令直至输入“exit”退出,关键在于合理设置初始值、条件判断和变量更新机制。
-
变量访问异常若源于exports目标模块名错误,本质是模块导出与导入名称不匹配,多见于CommonJS或混合环境;需严格核对导出方式(默认/命名)、导入语法、路径解析及循环依赖等问题。
-
三元运算符?:在Java中为右结合,即a?b:c?d:e等价于a?b:(c?d:e);嵌套两层以上必须显式加括号以防歧义;类型兼容性要求更严,易报Typemismatch;含副作用或空值访问时应改用if-else。
-
使用Collections.unmodifiableMap()封装静态路由表是最轻量安全的做法,它在初始化阶段创建只读视图防止误修改,但需确保临时map为局部变量;Java9+推荐用Map.copyOf()或Map.of()获得真正不可变副本。
-
长整型在32位系统上非原子读写,因CPU一次仅处理32位,导致64位变量被拆分为高低32位两次操作,多线程并发时可能读到“撕裂”中间态;Java中volatilelong或AtomicLong可保证原子性。
-
BlockingQueue是Java中实现生产者消费者模式的线程安全工具,位于java.util.concurrent包下,通过put()和take()方法实现阻塞操作,当队列满时生产者阻塞,空时消费者阻塞,无需手动同步;其常用实现有ArrayBlockingQueue(有界数组队列)、LinkedBlockingQueue(可选有界链表队列)和SynchronousQueue(不存储元素的同步队列);示例代码展示使用ArrayBlockingQueue进行生产和消费,生产者每500毫秒发送消息,消费者每
-
BigDecimal.negate()是财务对冲计算最安全高效的正负翻转方式,直接翻转符号位、保留原始精度、避免字符串解析风险,比multiply(newBigDecimal("-1"))更优。