在Java中删除字符串中第一个单词的最佳方法

use*_*557 1 java string performance

摆脱字符串中第一个标记的最快方法是什么?到目前为止,我试过这个:

String parentStringValue = this.stringValue.split(" ", 2)[1];
Run Code Online (Sandbox Code Playgroud)

它的内存和速度极低(当15个字长的字符串重复数百万次时).假设字符串由用空格分隔的标记组成.

Rud*_*haw 6

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);
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对象之间应该没有区别.


Ruc*_*era 5

无需拆分和创建数组,只需使用子字符串

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)