提高可读性。使用的时候要注意:在字面常量数字里加下划线是有一定规则的,下划线只能在数字之间,在数字的开始或结束一定不能使用下划线。在本章节的以下部分,我们将学习如何在字面常量数字中使用下划线,以及在字面常量数字中使用它们的规则。

怎样在Java中有效的给数字使用下划线

正如我之前说的,这不过是个语法糖,非常像字符串在 switch 场景下的实现,这也是使用编译器的帮助下实现的。编译期间,编译器把这些下划线移除,并把真实的数字赋值给变量。比如在编译期间10_000_000将会被转化成10000000。既然CPU在处理长数字上毫无压力,对于我们这些可怜的在处理长数字上有困难的人类来说,就不用为它烦恼了。这个特征尤其在需要处理大数额金钱、信用卡号码、银行账号以及其它需要长账号的银行和金融领域更有用。尽管在写Java文件里写敏感信息很让人沮丧,我们应该永远不要在编码的时候这么做。但在数字中用下划线让我们的生活比以前变得更加简单了。

在Java中给数字加下划线的规则



Java编码语言对给数值型的字面值加下划线有严格的规定。如上所述,你只能在数字之间用下划线。你不能用把一个数字用下划线开头,或者已下划线结尾。这里有一些其它的不能在数值型字面值上用下划线的地方:

  • 在数字的开始或结尾
  • 对浮点型数字的小数点附件
  • F或L下标的前面
  • 该数值型字面值是字符串类型的时候

这里有一些例子,来表现哪些地方加给数字加下划线有效,哪些地方给数字加下划线无效



float           pi1 = 3_.1415F;           // 无效的; 不能在小数点之前有下划线         


          float           pi2 =           3          ._1415F;           // 无效的; 不能在小数点之后有下划线         


          long           socialSecurityNumber1 = 999_99_9999_L;           //无效的,不能在L下标之前加下划线         


          int           a1 = _52;           // 这是一个下划线开头的标识符,不是个数字         


          int           a2 = 5_2;           // 有效         


          int           a3 = 52_;           // 无效的,不能以下划线结尾         


          int           a4 = 5_______2;           // 有效的         


          int           a5 = 0_x52;           // 无效,不能在0x之间有下划线         


          int           a6 = 0x_52;           // 无效的,不能在数字开头有下划线         


          int           a7 = 0x5_2;           // 有效的 (16进制数字)         


          int           a8 = 0x52_;           // 无效的,不能以下划线结尾         


          int           a9 = 0_52;           // 有效的(8进制数)         


          int           a10 = 05_2;           // 有效的(8进制数)         


          int           a11 = 052_;           // 无效的,不能以下划线结尾




下面是一些在数字中用下划线的其它示例:



long           creditCardNumber = 6684_5678_9012_3456L;           // 在编码的时候,最好永远不要这么做         


          long           socialSecurityNumber = 333_99_9999L;           // 在编码的时候,最好永远不要这么做         


          float           pi =           3          .14_15F;         


          long           hexBytes = 0xFF_EC_DE_5E;         


          long           hexWords = 0xCAFE_BABE;         


          long           maxLong = 0x7fff_ffff_ffff_ffffL;         


          byte           nybbles = 0b0010_0101;         


          long           bytes = 0b11010010_01101001_10010100_10010010;




使用下划线后,你会发现你的代码比以前可读性更强。顺便说一句,在java中应该一直用L去表示一个长整型数字。尽管用小写的l表示长整型数也是合法的,但他看起来太像1了,所以应该永远都不要用它。告诉我你能不能再 12l和121之间找出差别,我猜能找到的人不多吧。但是在 12L与121之间呢?

养成在数字中使用下划线的习惯,尤其是对长整型数来说,这样能增加它的可读性。我知道这个功能只是从Java1.7开始才有效,还没有被广泛的使用。但鉴于Java1.8的现状,我期望Java8在Java社区中传播比Java7更加迅速更加广泛。