摆脱字符串中第一个标记的最快方法是什么?到目前为止,我试过这个:
String parentStringValue = this.stringValue.split(" ", 2)[1];
而且它的内存和速度效率极低(当对 15 个字长的字符串重复数百万次时)。假设字符串由以空格分隔的标记组成。
最佳答案
StringBuilder vs 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);
上面我是乱序跑的,热身后,陆续取平均,从500万次增加到3000万次,每跑10次再进行下一次。无论哪种方式,最快到最慢的顺序都保持不变。以下是上述代码的一些示例输出;
StringBuilder Method Took 203
Substring Method Took 588
Split Method Took 1833
Regex Method Took 2517
值得一提的是,使用长度大于 1 的 String
调用 split()
只是在其实现中使用 Regex,因此使用和使用应该没有区别split()
和一个 Pattern
对象。
关于java - 在 Java 中删除字符串中第一个单词的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26158430/