Java中long类型数值字面量可用下划线增强可读性,下划线仅限数字之间,不可在开头、结尾、进制前缀后、类型后缀前或小数点旁;编译时被完全忽略,运行时与无下划线写法完全等价。

Java 中 long 类型的数值字面量可以用下划线增强可读性,只要符合 Java 7+ 的语法规则——下划线纯粹是源码级分隔符,编译后完全消失,运行时与不带下划线的写法完全等价。
合法的 long 下划线写法
下划线必须严格位于两个数字字符之间,不能触碰边界或特殊符号:
- 十进制:
long count = 1_000_000_000L;(比1000000000L更易识别数量级) - 十六进制:
long mask = 0xFF00_FF00_FF00_FF00L;(按字节分组,便于位运算理解) - 二进制:
long flags = 0b1100_1010_0001_1111_0000_0000_0000_0000L;(每 4 位一组,对应 hex 习惯) - 科学计数法系数部分:
double d = 6.022_140_76e23;(注意:下划线不能出现在e或E旁边)
常见非法位置(编译报错)
这些写法会直接导致编译失败:
- 开头或结尾:
long x = _1000L;、long y = 1000_L; - 紧邻小数点:
double z = 3._14159L;(long不支持小数,但 float/double 同理禁止) - 紧贴进制前缀:
long w = 0x_FFFFL;、long v = 0b_101L; - 紧贴类型后缀:
long u = 1000_000L;✅ 合法;long t = 1000_000_L;❌ 非法 - 连续多个下划线:
long s = 1__000L;(即使语法上某些旧编译器可能容忍,也应避免)
实际编码建议
为提升团队协作效率和长期可维护性:
- 只在真正长的数值中使用,如金额、内存地址、掩码、大整数 ID,而非
42L或100L - 统一分组习惯:十进制按千位(
1_000_000L),十六进制/二进制按字节(0xFF_FF_00_00L) - 确保 JDK 版本 ≥ 7,且构建配置未降级 target bytecode(如
-target 6会禁用该特性) - IDE 通常会高亮显示非法下划线位置,善用这一提示快速校验
运行时行为说明
下划线在词法分析阶段就被剥离,生成的字节码与无下划线版本一致:
-
long a = 1_000_000L;和long b = 1000000L;编译后完全相同 - 调试时变量值显示不含下划线,反编译工具(如
javap)输出也不含下划线 - 不增加 class 文件体积,不影响性能、内存布局或任何运行时行为

















