再次进入到 JDK7 语法增强的第二道道上来,也就是数值常量书写时可以中间插入下划线作为分隔线,也就是 int i = 22_33 相当于 int i = 2233,仅仅是一定程度上的有助于阅读代码,除此之外,别无它处。编译后或执行时这些下划线便透明掉了,编译后的字节码里也没有了附加的下划线,当然执行时也不可能向你输出下整数 i 为 22_33 的。
也不知道是谁只是众目期盼中的版本净找些这类来增强,感觉意义不是很大,大约类同于二进制方式来表示整数。这里的数值包括整数和小数的,加上 16 进制那么可用来表示数字的字符就有 0-9 和 a-f(A-F) 了,注意下划线只能加在前面所列的某两个字符之间,而且可连续多个下划线。看例子吧:
1 2 3 4 5 6 7 8 |
long creditCardNumber = 1234_5678_9012_3456L; //我们给你发银行帐号,是否常喜欢四个一组分开啊,可用字符串啊 long socialSecurityNumber = 999_99_9999L; float pi = 3.14_15F; long hexBytes = 0xFF_EC_DE_5E; //16 进制表示,一组一个字节 long hexWords = 0xCAFE_BABE; //Magic Number, Class 中的 long maxLong = 0x7fff_ffff_ffff_ffffL; //看到这个用来表示颜色的 RGB Alpha 呢,或许吧,像 #FF_CE_DD_91 byte nybbles = 0b0010_0101; long bytes = 0b11010010_01101001_10010100_10010010; //一个字节又一个字节 |
下划线只能在两个数字之间; 只要记住这一点就足够的,放在别的两头不接数字的地方是要坚决被和谐的,像下面位置是不合法的:
- 开始和结尾
- 不能放在小数点的前后
- 在
F(当它不表示数值的时候)
和L
后缀之前 - In positions where a string of digits is expected
下面列出了一些数字常量中使用下划线的合法与非法的情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
float pi1 = 3_.1415F; // 非法,不能在紧临小数点之前 float pi2 = 3._1415F; // 非法,也不能在紧临小数点之后 long socialSecurityNumber1 = 999_99_9999_L; // 非法,不能在 L 之前,L 又不是数字 int x1 = _52; // 最前面不行,下划线和字符开头的东东是个标识符了, 不是数字 int x2 = 5_2; // 没问题 (两个数字之间) int x3 = 52_; // 不行,不能在数字末端,也就是下划线后没有数字 int x4 = 5_______2; // OK (连续多个下划线也无妨,谁爱谁这样用去) int x5 = 0_x52; // 非法,不能在 0x 进制标识之间 int x6 = 0x_52; // 非法,不能在数字之首 int x7 = 0x5_2; // OK (16 进制数之间也一样的) int x8 = 0x52_; // 非法,不能放在末端 int x9 = 0_52; // OK (这是有效的,这个多留意,0在最前面虽然标识了8进制,但0它仍然是个数字,下划线到底还是在两个数字间) int x10 = 05_2; // OK (这个好理解) int x11 = 052_; // 非法,不能在末尾 |
直接能想像到的便利就是十六进制或二进制表示字节的时候可以两位一组或八位一组,比如像二进制编辑器(UE) 那样分组显示字节般;还有就是中国人在方便阅读时可以在整数部分四个数字一组的标,万亿兆,相应的老美就可三个一组的分,分别是 K, M, B, G 下去。
上面的例子代码去说明下划线可以用在什么地方,不可以用在什么方,我觉得反而罗嗦了点,并没有说到点子上。其实一言(三条)以蔽之就是:
当下划线用于数值常量中时,它必须出现在两个数字之间,也就是它两端必须是数字;当 ox 开头的 16 进制数,a-f 或 A-F 也应认为是数字,8 进制时起始的 0 既是标识也是个数字;多个连续的下划线与一个下划线等效。
可以看过来:http://download.java.net/jdk7/docs/technotes/guides/language/underscores-literals.html
本文链接 https://yanbin.blog/jdk-7-enhance-underscores-literals/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。