检查字符串的最快方法是Java中的字母数字

检查String是否仅包含字母数字字符的最快方法是什么。

我有一些代码会嚼掉很多CPU,我想知道是否会比使用预编译的正则表达式更快。

更新:这么多的投票,关心解释? Stackoverflow不应该用于讨论用于实现任务的算法可能会更快?

使用String.matches() ,如:

String myString = "qwerty123456"; System.out.println(myString.matches("[A-Za-z0-9]+")); 

这可能不是绝对“最快”的可行方法。 但总的来说,尝试与那些在性能方面编写语言“标准库”的人竞争并没有什么意义。

我已经编写了validation“正确”答案的测试。 在运行Java 1.6的四核OSX10.8计算机上完成测试

有趣的是,使用正则表达式比手动迭代字符串慢大约5-10倍。 此外, isAlphanumeric2()函数比isAlphanumeric()略快。

 public class QuickTest extends TestCase { private final int reps = 1000000; public void testRegexp() { for(int i = 0; i < reps; i++) ("ab4r3rgf"+i).matches("[a-zA-Z0-9]"); } public void testIsAlphanumeric() { for(int i = 0; i < reps; i++) isAlphanumeric("ab4r3rgf"+i); } public void testIsAlphanumeric2() { for(int i = 0; i < reps; i++) isAlphanumeric2("ab4r3rgf"+i); } public boolean isAlphanumeric(String str) { for (int i=0; i= 0x3a && c <= 0x40) || (c > 0x5a && c <= 0x60) || c > 0x7a) return false; } return true; } } 

正则表达式可能非常有效,因为您可以指定范围: [0-9a-zA-Z] 。 假设正则表达式的实现代码是有效的,这将仅需要每个范围的上限和下限比较。 这基本上是编译的正则表达式应该做的事情:

 boolean isAlphanumeric(String str) { for (int i=0; i= 0x3a && c <= 0x40) || (c > 0x5a && c <= 0x60) || c > 0x7a) return false; } return true; } 

我没有看到你的代码如何比这更有效,因为每个角色都需要被检查,并且比较实际上不会更简单。