-
验证继承是否符合里氏替换原则(LSP)最本质的方式是检查“换而不变”:父类实例替换为子类实例后,返回值、异常、副作用和执行逻辑必须完全一致;需自问三关键问题并严查方法重写的四大雷区;发现违规时优先采用接口、组合或抽象基类替代继承。
-
JNDI通过名称查找容器管理的运行时资源,核心是“名字到对象”映射;常见类型包括env-entry、resource-ref、resource-env-ref和ejb-ref;查找须遵循java:comp/env/等命名规则,且部署端需在web.xml、context.xml或standalone.xml中完成对应配置。
-
ThreadLocalRandom明显快于Random,因其为每个线程维护独立种子,避免CAS竞争与伪共享;Random依赖AtomicLong+CAS更新共享种子,高并发时自旋重试导致性能骤降。
-
System.arraycopy()是JVM优化的本地方法,通过直接内存操作实现高效数组拷贝,需严格校验srcPos+length≤src.length和destPos+length≤dest.length以避免越界。
-
接口定义“能做什么”,抽象类描述“是什么”;接口支持多实现以组合行为,抽象类仅单继承但可复用代码和状态。
-
定义检查型自定义异常需继承Exception,提供无参、Stringmessage及含上下文(如orderId)的构造方法,字段final并提供getter;运行时异常则继承RuntimeException,须包含message和cause构造方法;throw抛实例,throws声明类型;异常类应实现Serializable,避免不可序列化字段,统一message格式以利日志定位。
-
Scanner.nextLine()读不到第一行是因为前一个nextInt()等方法残留换行符,需额外nextLine()消费;应统一用nextLine()读再转换类型,注意中文编码、手机号/邮箱校验、资源关闭及hasNextXxx()需配nextXxx()。
-
反射读取嵌套注解本质是逐层获取运行时注解实例:外层注解元素必须为内层注解类型且两者均需@Retention(RUNTIME);获取外层实例后直接调用其方法得到内层代理对象,再递归处理,注意空值检查、禁止对注解调用getAnnotation、限制递归深度。
-
Boolean.logicalOr()不适合函数式布尔复合,因其是立即求值的静态方法,不支持惰性计算、不可组合、不返回一等函数;应改用BooleanSupplier封装或自定义高阶组合工具。
-
反射调用比直接调用慢10–100倍,因JVM无法内联Method.invoke(),需动态解析、权限检查、类型匹配、装箱拆箱及异常包装;应缓存Method、设setAccessible(true),优先用代码生成替代。
-
答案:使用Mockito可创建mock对象并验证行为。首先添加依赖,通过@Mock或Mockito.mock()创建mock对象,用when().thenReturn()设定返回值,verify()验证方法调用次数及方式,结合JUnit注解初始化提升效率。
-
Files.walkFileTree()配合SimpleFileVisitor统计文件夹总大小的核心是重写visitFile()累加文件大小,通过AtomicLong线程安全计数,visitFileFailed()控制异常跳过,比Files.walk()更稳健可控。
-
StringBuilder适用于频繁字符串拼接场景,核心价值是避免重复创建对象;单次拼接由编译器优化,无需手动使用;需预设容量、注意append()参数陷阱、toString()后应清空或弃用实例。
-
判定第三方包静态集合致类无法卸载,关键看Class对象是否被强引用;静态final集合是最常见持有者,需通过日志追踪、反编译分析、MAT查GCRoots及隔离类加载器验证来定位和解决。
-
指令饥饿本质是硬件扰动导致调度器失能,使yield后线程无法被再调度;需从替代等待原语、强化时间中断韧性、设置实时调度保护三方面构建韧性。