Java中\_仅可用作数字字面量分隔符,如1_000_000;不能作运算符、变量名或占位符,Java 9+禁止其作为标识符,编译时会报错。

Java里没有 _ 运算符,它不是Java语言定义的运算符,不能用于算术、逻辑或位操作。你看到的 _ 通常出现在数字字面量中(如 1_000_000),是Java 7引入的**数字字面量分隔符**,仅作可读性辅助,编译时被完全忽略。
Java中哪些地方能用_?只限数字字面量内部
它只能插入在数字字面量的**数字之间**,不能开头、结尾、紧邻小数点或进制前缀(如 0x、0b):
-
int a = 1_000_000;✅ 合法,等价于1000000 -
long b = 0x1_A2B_C3D;✅ 十六进制中可用 -
double c = 3.14_159;✅ 浮点数的小数部分也可用 -
int d = _100;❌ 开头下划线报错:Invalid character in number -
int e = 100_;❌ 结尾下划线同样不合法 -
int f = 0x_A1;❌ 紧邻0x不允许
为什么_不能当变量名或运算符用?
Java标识符规范(JLS §3.8)明确禁止 _ 单独作为标识符(从Java 9起),且它从未被定义为运算符。如果你写了类似 a _ b 或 int _ = 5;,会直接触发编译错误:
error: illegal start of expression
int a _ b = 10;
^
error: not a statement
int _ = 5;
^注意:_ 在Java 8及以前可作变量名(但不推荐),Java 9+已将其列为保留字,禁止用作标识符 —— 这和它“不是运算符”是两回事,但都说明它不具备运算功能。
立即学习“Java免费学习笔记(深入)”;
常见误用场景:把Python/JS习惯带进Java
有些开发者从Python(支持 _ 作上一次表达式结果)或JavaScript(解构赋值中可用 _ 占位)转来,误以为Java也支持类似写法。实际Java中:
- 没有交互式解释器的
_隐式变量机制 - 解构赋值(如record pattern)中也不支持
_占位(Java 21+仍不支持,需显式命名) - 函数参数或lambda中不能用
_表示“忽略”,必须写合法标识符(哪怕叫ignored)
真正要实现“忽略”语义,得靠显式声明或注释,比如 public void handle(Event e) { /* ignore */ };想提升大数字可读性,就老实用 1_000_000 —— 别试图给它赋予运算含义,编译器不会配合。










