【发布时间】:2015-06-06 05:39:06
【问题描述】:
有两种方法:
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 中,参见here,第 2312 行。 -
@tobias_k 有趣的是,你是唯一一个指出关键细节的人......在评论中,所有其他人都写了不完整的答案。
-
松散相关的答案 - stackoverflow.com/a/26159501/2182928