博客 / 詳情

返回

java 獲取子串速度比較

有個需求,需要將給定字符串提取子串,比如(aaa.xx)變成aaa,有幾個思路。

  1. 使用正則模式匹配,然後替換
  2. 使用正則替換
  3. 使用substring

代碼如下:

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class main {

    public static int len = 10000000;

    public static void useRegMatch(){
        LocalDateTime start = LocalDateTime.now();
        List<String> v = new ArrayList<String>();
        for(int i = 0; i < len; ++i) {
            v.add("230202"+i+i+".IB"+i);
        }
        //handle use reg
        Pattern pattern = Pattern.compile("^(.+)(\\.)(.+)$");
        Matcher matcher;
        for(int i = 0; i < v.size();++i){
            matcher = pattern.matcher(v.get(i));
            if(matcher.find()) {
                v.set(i, matcher.group(1));
            }
        }
        LocalDateTime end = LocalDateTime.now();
        System.out.println("useRegMatch,waste:"+Duration.between(start, end).toMillis()+"   "+v.get(0)+"   "+v.get(1));
    }

    public static void useRegReplace(){
        LocalDateTime start = LocalDateTime.now();
        List<String> v = new ArrayList<String>();
        for(int i = 0; i < len; ++i) {
            v.add("230202"+i+i+".IB"+i);
        }
        //handle use reg
        for(int i = 0; i < v.size();++i){
            String newV = v.get(i).replaceAll("(\\.)(.+)$","");
            v.set(i, newV);
        }
        LocalDateTime end = LocalDateTime.now();
        System.out.println("useRegReplace,waste:"+Duration.between(start, end).toMillis()+"   "+v.get(0)+"   "+v.get(1));
    }

    public static void useSpliceIndexOf(){
        LocalDateTime start = LocalDateTime.now();
        List<String> v = new ArrayList<String>();
        for(int i = 0; i < len; ++i) {
            v.add("230202"+i+i+".IB"+i);
        }
        //handle use reg
        for(int i = 0; i < v.size();++i){
            v.set(i, v.get(i).substring(0,v.get(i).indexOf(".")));
        }
        LocalDateTime end = LocalDateTime.now();
        System.out.println("useRegReplace,waste:"+Duration.between(start, end).toMillis()+"   "+v.get(0)+"   "+v.get(1));
    }

    public static void main(String[] args) {
        useRegMatch();
        useRegReplace();
        useSpliceIndexOf();
    }
}

測試結果如下:
image.png

結論:
使用substring+indexOf的方式速度最快。

user avatar kasong 頭像 yaofly 頭像 fehaha 頭像 nihaojob 頭像 chensida 頭像 luoshenshen 頭像 alogy 頭像 zhuomoxiansheng_5f1901de6fd23 頭像 lianhuatongzina 頭像 mysteryjack 頭像 skipshow 頭像 tnfe 頭像
17 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.