我认为这是隐藏字符串的最有效方法
new StringBuilder(s1.length() + s2.length() + s3.length()).append(s1).append(s2).append(s3).toString();
这里创建的StringBuilder缓冲区的容量足以容纳其中的所有字符串,否则StringBuilder可能需要将缓冲区扩展最多3倍.
但是当我编译/反编译
String s4 = s1 + s2 + s3;
我得到了由javac(1.7.0_03)构建的.class中的实际代码为
String s4 = (new StringBuilder(String.valueOf(s1))).append(s2).append(s3).toString();
哪种方法更有效?
更新
正如Steven Schlansker所建议的那样,这是一项性能测试
String s1 = "0123456789";
String s2 = s1 + s1 + s1;
String s3 = s1 + s1 + s1 + s1 + s1 + s1;
long t0 = System.currentTimeMillis();
for (int i = 0; i < 500000; i++) {
String s4 = new StringBuilder(s1.length() + s2.length() + s3.length()).append(s1).append(s2).append(s3).toString();
// String s4 = s1 + s2 + s3;
}
System.out.println(System.currentTimeMillis() - t0);
它并不完美,但结果似乎证明我的版本快了30%.在我的笔记本电脑(Celeron 925)上,版本1大约需要230毫秒,而版本2则需要300毫秒.其实这就是我所期望的.因此,我认为如果Javac以更有效的方式编译字符串隐式化将是一个好主意.有足够的线像
return "\Q" + s + "\E";
即使在JDK类中.最后一行来自java.util.Pattern,其目的是提高效率