use*_*557 1 java string performance
摆脱字符串中第一个标记的最快方法是什么?到目前为止,我试过这个:
String parentStringValue = this.stringValue.split(" ", 2)[1];
Run Code Online (Sandbox Code Playgroud)
它的内存和速度极低(当15个字长的字符串重复数百万次时).假设字符串由用空格分隔的标记组成.
substring( x )vs split( x )vs Regex答案已编辑:主要缺陷已更正
在我的基准测试中纠正了一些相当重大的缺陷之后(正如Jay Askren在评论中指出的那样).该StringBuilder方法以最快的速度出现(虽然这假设StringBuilder对象是预先创建的),子串出现在第二位.split()排名倒数第二,比StringBuilder方法慢10倍.
ArrayList<String> strings = new ArrayList<String>();
ArrayList<StringBuilder> stringBuilders = new ArrayList<StringBuilder>();
for(int i = 0; i < 1000; i++) strings.add("Remove the word remove from String "+i);
for(int i = 0; i < 1000; i++) stringBuilders.add(new StringBuilder(i+" Remove the word remove from String "+i));
Pattern pattern = Pattern.compile("\\w+\\s");
// StringBuilder method
before = System.currentTimeMillis();
for(int i = 0; i < 5000; i++){
for(StringBuilder s : stringBuilders){
s.delete(0, s.indexOf(" ") + 1);
}
}
after = System.currentTimeMillis() - before;
System.out.println("StringBuilder Method Took "+after);
// Substring method
before = System.currentTimeMillis();
for(int i = 0; i < 5000; i++){
for(String s : strings){
String newvalue = s.substring(s.indexOf(" ") + 1);
}
}
after = System.currentTimeMillis() - before;
System.out.println("Substring Method Took "+after);
//Split method
before = System.currentTimeMillis();
for(int i = 0; i < 5000; i++){
for(String s : strings){
String newvalue = s.split(" ", 2)[1];
System.out.print("");
}
}
after = System.currentTimeMillis() - before;
System.out.println("Your Method Took "+after);
// Regex method
before = System.currentTimeMillis();
for(int i = 0; i < 5000; i++){
for(String s : strings){
String newvalue = pattern.matcher(s).replaceFirst("");
}
}
after = System.currentTimeMillis() - before;
System.out.println("Regex Method Took "+after);
Run Code Online (Sandbox Code Playgroud)
我按照随机顺序运行上述内容,经过热身后,连续取平均值,将操作次数从500万增加到3000万,然后每次运行十次,然后继续下一次.无论哪种方式,最快到最慢的顺序保持不变.以下是上述代码的一些示例输出;
StringBuilder Method Took 203
Substring Method Took 588
Split Method Took 1833
Regex Method Took 2517
Run Code Online (Sandbox Code Playgroud)
值得一提的split()是String,使用长度大于1的调用只是在其实现中使用Regex,因此使用split()和Pattern对象之间应该没有区别.
无需拆分和创建数组,只需使用子字符串
String str="I want to remove I";
String parentStringValue = str.substring(str.indexOf(" ")+1);
System.out.println(parentStringValue);
Run Code Online (Sandbox Code Playgroud)
输出:
want to remove I
Run Code Online (Sandbox Code Playgroud)