有两种方法:Pattern.split慢于String.split
private static void normalSplit(String base){
base.split("\\.");
}
private static final Pattern p = Pattern.compile("\\.");
private static void patternSplit(String base){
//use the static field above
p.split(base);
}
我在main方法测试他们是这样的:
public static void main(String[] args) throws Exception{
long start = System.currentTimeMillis();
String longstr = "a.b.c.d.e.f.g.h.i.j";//use any long string you like
for(int i=0;i<300000;i++){
normalSplit(longstr);//switch to patternSplit to see the difference
}
System.out.println((System.currentTimeMillis()-start)/1000.0);
}
直觉,我觉得作为String.split
最终将调用Pattern.compile.split
(经过很多额外的工作)才能做到真正的事情。我可以预先构造Pattern对象(它是线程安全的)并加速分裂。
但事实是,使用预构造的模式是要比直接调用String.split
慢得多。我尝试了一个长度为50个字符的字符串(使用MyEclipse),直接调用仅消耗使用预构造的Pattern对象的一半时间。
请有人能告诉我为什么发生这种情况?
看看源。它调用'Pattern.compile(regex).split(this,limit)',但前提是要分割的字符串不止一个字符。至少在OpenJDK7中,参见[这里](http://www.docjar.com/html/api/java/lang/String.java.html),第2312行。 – 2015-04-01 14:21:20
@tobias_k有趣的是,你是唯一一个指向在关键的细节中......所有其他人都写下了不完整的答案。 – GhostCat 2015-04-01 14:32:27
松散相关的答案 - http://stackoverflow.com/a/26159501/2182928 – 2015-04-01 14:46:31