实际上这里有两个问题。第一个:
1)Java是否足够聪明,不能将一个数组元素复制到自身中?
我的意思是:
int i = 1;
char [] chars=... //some chars
char[1] = char[i]; // first element into itself
2)番石榴的基准测试是否向公众开放?
我的意思是:我正在查看CharMatcher removeFrom方法的源代码并看到了这个:
// This unusual loop comes from extensive benchmarking
OUT: while (true) {
pos++;
while (true) {
if (pos == chars.length) {
break OUT;
}
if (isLetter(chars[pos])) {
break;
}
chars[pos - spread] = chars[pos];
pos++;
}
spread++;
}
return new String(chars, 0, pos - spread);
我真的很喜欢这个主意,但编码了我自己的方法:
public static String removeMine(String input){
char [] chars = input.toCharArray();
int howManyLetters = 0;
for(int i=0;i<chars.length;++i){
if(isLetter(chars[i])) {
chars[howManyLetters++] = chars[i];
}
else {
if(i == (chars.length - 1)) break;
chars[i] = chars[i+1];
}
}
return new String(chars, 0, howManyLetters);
}
然后我添加了一些基准测试(如果需要,我会将它们放在github上),结果如下:
我(严重?)怀疑番石榴的创造者没有这样的版本,我认为有理由放弃它(评论更明显)。我希望看到的是他们所做的实际基准测试,或者是采用这种方法的一些严肃理由。我假设它与您运行代码的JVM类型有关,但实际的证据将不胜感激。
P.S。我仍然要用jmh测试这个,一旦我完成就会提供结果。