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

标签 java string performance

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

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/

相关文章:

Java:如何使用 ObjectOutputStream 将静态文本添加到文件

c# - float 的乘法性能不一致

string - 统计字符串比较

python - 为什么多线程不加速用lxml解析HTML?

java - 什么时候在Java中初始化数组?

java - 从非泛型方法调用泛型方法

Java Paypal 集成 SOAP JAX-WS - SSL 握手异常

java - 显示标签库的依赖项

php - 抓取给定关键字前后的 x 个单词?

c# - String.Concat 、string.format 和 + 之间有什么区别?