下划线数字字面量仅在源码中存在,编译时被词法分析阶段完全剔除,class文件、反编译结果、运行时值及调试显示均为无下划线形式,ide高亮仅为编辑器渲染假象。

反编译后,带下划线的数字字面量完全看不到下划线——它和没加时一模一样。
下划线在字节码里根本不存在
Java 编译器在词法分析阶段就直接把所有合法下划线剔除了,不参与后续任何语义处理。生成的 class 文件中,常量池里存的是纯数字(比如 1000000),不是 1_000_000。用 javap -c 或任意反编译工具(如 CFR、JADX)查看,结果都是原始无下划线形式。
所有运行时场景都不保留下划线
- 调试时鼠标悬停或变量视图显示的值是 1000000,不是带下划线的字符串
- 通过反射读取注解里的数值参数(如
@Timeout(value = 30_000)),得到的仍是 int 类型的 30000 -
String.valueOf(1_000_000)输出 "1000000",不是 "1_000_000"
为什么容易误以为它“还在”
IDE(如 IntelliJ、Eclipse)会在编辑时高亮并保持下划线显示,给人留下“它被保留”的错觉。但这是编辑器对源码的语法渲染,和编译结果无关。一旦编译完成,下划线就彻底消失,就像代码里的空格或换行符一样,仅服务于人眼阅读。
对比其他“看起来像保留”的东西
和 String.format("%,d", 1000000) 不同:后者是运行时生成带逗号的字符串,结果可被日志、API、前端消费;而下划线只活在 .java 源文件里,连 class 文件的边都沾不上。它不是格式化,是书写习惯。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











