java中只有整型和浮点型字面量支持下划线,且必须位于数字之间,不能在开头、结尾、小数点前后、进制前缀后或指数符号旁;下划线是纯语法糖,编译时被剥离,不影响运行时行为、字节码或性能。

Java里哪些数字字面量能用下划线
只有整型和浮点型字面量(int、long、short、byte、float、double)支持下划线,且必须在数字之间——不能开头、结尾、小数点前后紧挨着、进制前缀后或指数符号旁。
-
1_000_000✅ 合法:千位分隔 -
0x1A_F0✅ 合法:十六进制中分隔 -
123_❌ 编译错误:illegal underscore -
_123❌ 同上 -
3.14_159✅ 合法:小数部分可分隔 -
1e2_3❌ 不行:指数部分不能加下划线
为什么编译器允许但运行时完全忽略下划线
下划线是纯语法糖,只在词法分析阶段被剥离,不参与语义解析。JVM 字节码里根本不存在下划线——它和空格一样,只是让源码更易读的“注释式字符”。
- 不影响任何运行时行为、内存布局或性能
- 不会增加 class 文件体积(下划线不存入常量池)
- 反编译出来的代码也不会带下划线(比如用
javap看不到) - IDE 通常会高亮显示下划线位置,但仅限编辑时辅助;一旦编译通过,就彻底消失了
实际编码中怎么用才不翻车
下划线不是装饰品,得用在真正影响可读性的长数字上。乱加反而干扰扫描,尤其在团队协作或 CR 场景下。
- 优先用于金额、时间戳、掩码、大数组索引等:比如
10_000_000(千万)、0b1100_1010_0011_1100(位操作)、1_576_800_000L(2020 年 Unix 时间戳) - 避免在短数字里滥用:
42写成4_2反而奇怪 - 二进制/十六进制建议按标准分组:4 位一组(
0b1010_1100_0011_1111),别随意断开 - 注意 IDE 和旧 JDK 兼容性:Java 7+ 支持,但若项目还跑在 Java 6 上,加了直接编译失败
容易被忽略的边界情况
下划线看着简单,但几个冷门规则一踩就报错,而且错误提示往往不直观。
立即学习“Java免费学习笔记(深入)”;
- 连续两个下划线:
1__000→ 报错illegal underscore,不是警告 - 下划线紧贴小数点:
3_.14或3._14都非法 - 科学计数法里只能在底数部分用:
1_234e5✅,1234e_5❌ - 八进制字面量中,下划线不能放在前缀
0后第一位:0_123❌,但01_23✅(不过八进制本身已不推荐)
最常出问题的是从 Python 或 JS 复制数字格式过来,下意识加在末尾或开头——Java 对位置敏感,不像其他语言宽松。









