Java类名中有哪些字符有效?还有哪些其他规则管理Java类名称(例如,Java类名称不能以数字开头)?
在准确探索Java标识符中允许哪些字符时,我偶然发现了一些非常好奇的东西,似乎几乎肯定是一个bug.
我希望发现Java标识符符合以下要求:它们以具有Unicode属性的字符开头,ID_Start后跟具有该属性的字符,并且ID_Continue为前导下划线和美元符号授予例外.事实证明并非如此,而且我发现与我听说过的普通标识符或其他任何其他想法极为不同.
请考虑以下演示,证明Java标识符中允许使用ASCII ESC字符(八进制033):
$ perl -le 'print qq(public class escape { public static void main(String argv[]) { String var_\033 = "i am escape: \033"; System.out.println(var_\033); }})' > escape.java
$ javac escape.java
$ java escape | cat -v
i am escape: ^[
Run Code Online (Sandbox Code Playgroud)
不过,情况甚至更糟.实际上,几乎无限恶化.甚至允许NULL!还有数千个甚至不是标识符字符的其他代码点.我在Solaris,Linux和运行Darwin的Mac上测试了这一点,并且都给出了相同的结果.
这是一个测试程序,它将显示Java非常不允许作为合法标识符名称的一部分的所有这些意外代码点.
#!/usr/bin/env perl
#
# test-java-idchars - find which bogus code points Java allows in its identifiers
#
# usage: test-java-idchars [low high]
# e.g.: test-java-idchars 0 255
#
# …Run Code Online (Sandbox Code Playgroud) 由于java.lang.Math中的三角函数非常慢:是否有一个快速和良好近似的库?似乎可以在不损失太多精度的情况下快速进行几次计算.(在我的机器上,乘法需要1.5ns,而java.lang.Math.sin需要46ns到116ns).遗憾的是,还没有办法使用硬件功能.
更新:功能应该足够准确,比如GPS计算.这意味着您需要至少7个十进制数字的精度,这排除了简单的查找表.它应该比基本x86系统上的java.lang.Math.sin快得多.否则就没有意义了.
对于pi/4以上的值,除硬件功能外,Java 还会进行一些昂贵的计算.这样做是有充分理由的,但有时你更关心速度而不是最后一位精度.