java 获取子串速度比较

柯里棱镜
• 阅读 174

有个需求,需要将给定字符串提取子串,比如(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();
    }
}

测试结果如下:
java 获取子串速度比较

结论:
使用substring+indexOf的方式速度最快。

点赞
收藏
评论区
推荐文章
半臻 半臻
4年前
Python基础11——正则表达式
19正则表达式19.1正则基础正则表达式:字符串处理工具应用场景1.html查询2.验证字符串是否符合规则re模块match方法python通过正则表达式对字符串进行匹配importre使用match方法进行匹配操作re.match()从字符串的开始位置进行匹配,匹配成功,返回match对象。匹配失败,返回Noneresre
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Kubrnete Kubrnete
4年前
动态规划之马拉车算法
问题描述:给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。如"abc"有三个回文子串‘a','b','c'.示例1:输入:"abc"输出:3解释:三个回文子串:"a","b","c"示例2:输入:"aaa"输出
Stella981 Stella981
3年前
Python3正则表达式
在Python中使用正则表达式Python语言通过标准库中的re模块(importre)支持正则表达式。使用match方法匹配字符串匹配字符串也就是设定一个文本模式,然后判断另外一个字符串是否符合这个文本模式。importre
Stella981 Stella981
3年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
JavaScript常用函数
1\.字符串长度截取functioncutstr(str,len){vartemp,icount0,patrn/^\x00\xff/,strre"";for(vari
Stella981 Stella981
3年前
FastJson 反序列化注意事项
问题描述使用fastJson对json字符串进行反序列化时,有几个点需要注意一下:反序列化内部类反序列化模板类0\.Getter/Setter问题如我们希望返回的一个json串为"name":"name","isDeleted":true,"isEmpty":1
Wesley13 Wesley13
3年前
unity将 -u4E00 这种 编码 转汉字 方法
 unity中直接使用 JsonMapper.ToJson(对象),取到的字符串,里面汉字可能是\\u4E00类似这种其实也不用转,服务器会通过类似fastjson发序列化的方式,将json转对象,获取对象的值就是中文但是有时服务器要求将传参中字符串中类似\\u4E00这种转汉字,就需要下面 publ
Wesley13 Wesley13
3年前
Java
最近处于工程尾期,抽出点时间来学习下工程中用到的知识点。1.正则表达式作用:它使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。举例:在很多文本编辑器里,正则表达式被用来检索、替换某些文字或字符串。注意:当正则表达式和字符串函数都能解决问题时,尽量使用字符串函数,这样不容易出错,最重要的一点是字符串函数比正则表达式实现性能上要好得