-
AtomicFieldUpdater为什么不能直接更新任意字段它只支持volatile修饰的非静态字段,且必须是引用类型(Object及其子类),基本类型如int、long不行——这点很多人踩坑后才意识到。不是语法报错,而是运行时抛RuntimeException:比如java.lang.IllegalArgumentException:Mustbevolatiletype或java.lang.ClassCastException:cannotcasttojava.l
-
Java文档注释不生成Javadoc的根本原因是项目未被IDEA正确识别为Java模块,需确保pom.xml或build.gradle已导入、源码路径标记为SourcesRoot,并在ProjectStructure中配置正确的JDK和模块SDK;生成时须手动指定含javadoc.exe的JDK路径,添加UTF-8编码参数,可见性选Package才能包含package-private类,而生产环境推荐使用Maven/Gradle命令行生成以保障稳定性和定制化能力。
-
为什么Collections.swap不能交换Arrays.asList返回的列表?因为Arrays.asList返回的是一个固定大小的、不支持结构性修改的列表实现(Arrays$ArrayList),而Collections.swap内部会尝试调用set方法——这在该实现中会抛出UnsupportedOperationException。常见错误现象:Exceptioninthread"main"java.lang.UnsupportedOperationExcept
-
不能。String...与String[]在方法签名中不可互换:前者是语法糖,底层为数组但调用方式和重载解析规则不同;两者共存会导致编译失败,且可变参数必须位于参数列表末尾,空参时传入空数组而非null,泛型+可变参数易触发类型擦除警告。
-
StructuredTaskScope是Java21实现结构化并发的核心机制,通过作用域自动强制子任务生命周期与父作用域绑定,解决ExecutorService边界模糊、错误传播手动、资源清理不可靠等问题。
-
循环里取数组元素总报ArrayIndexOutOfBoundsException?先看索引算对没绝大多数ArrayIndexOutOfBoundsException不是数组真越界,而是循环变量和数组长度关系没理清。Java数组下标从0开始,最大合法索引是array.length-1,但很多人写for(inti=0;i=0;i--),起点必须减一如果用增强for(for(Typee:array)),彻底绕开索引——但前提是不需要知道当前下标多维数组嵌套循环的边
-
隐式类型转换仅发生在基本数据类型间且满足“小转大”、无精度损失的条件下,合法路径为byte→short→int→long→float→double及char→int→long→float→double。
-
JenkinsPipeline的readYaml工具步骤基于SnakeYAML实现,默认允许重复键且静默覆盖(不报错),这是由底层LoaderOptions.allowDuplicateKeys=true决定的,符合YAML规范对“非法重复键”的宽松处理策略。
-
用Predicate做集合过滤,别直接new匿名类Java8+里Predicate最常见的用途就是配合Collection.stream().filter()做条件筛选。但很多人一上来就写newPredicate(){...},这不仅啰嗦,还失去函数式接口的可组合性优势。正确做法是用lambda或方法引用:list.stream().filter(s->s.length()>5)——简单逻辑直接lambdalist.stream().filter(
-
charAt()遍历最直接,但需防索引越界;Java字符串不可变、底层为char[],该方法快且语义清晰,空串或i<=length()易致越界。
-
ClassNotFoundException和NoSuchMethodException是Java反射中常见异常,前者因类路径错误或类名拼写错误导致,需检查全限定名和类路径;后者因方法名或参数类型不匹配引发,应确保方法签名正确并使用getDeclaredMethod访问私有方法。通过try-catch分别捕获并输出详细信息,可提升程序稳定性与调试效率。
-
notifyAll()用于唤醒所有在对象上等待的线程,避免信号丢失和假死锁;必须在synchronized块中调用,配合while循环检查条件,不可用if,适用于多条件共享锁场景如生产者-消费者模型。
-
StampedLock乐观读必须配合validate()校验戳有效性,否则无效;validate()是轻量volatile读,stamp为0时恒返回false;禁用非标准\_validate命名;适用读多写少且读操作极快场景。
-
Java里没有回调函数,但可以用接口模拟Java没有像JavaScript那样的function类型或一级函数,所谓“回调”,本质是把行为封装进接口实例,由调用方在合适时机通过接口方法触发。关键不是语法糖,而是谁持有接口引用、谁负责调用。常见错误是定义了回调接口却忘了传入实现类,导致运行时NullPointerException;或者在异步线程中直接操作UI组件(Android)或非线程安全对象,引发崩溃或数据错乱。回调接口必须定义清晰的契约:方法名、参数、是否允许为null、
-
判断字符串为空或空白应先判null再trim().isEmpty(),或用StringUtils.isBlank()、JDK11+的isBlank();substringendIndex不包含且需满足索引范围;replace处理字面量,replaceAll处理正则;循环拼接必须用StringBuilder。