Есть два способа: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);
}
И я протестировать их, как это основной метод:
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.
Пожалуйста, может кто-нибудь сказать мне, почему это происходит?
Посмотрите на источник. Это _does_ вызывает 'Pattern.compile (regex) .split (this, limit)', но только если строка для разделения более одного символа. По крайней мере, в OpenJDK7 см. [Здесь] (http://www.docjar.com/html/api/java/lang/String.java.html), строка 2312. –
@tobias_k Забавно, вы единственное, из этой важной детали ... в комментарии, где все остальные люди пишут неполные ответы вместо этого. – GhostCat
Непосредственный ответ - http://stackoverflow.com/a/26159501/2182928 –