java replaceAll 正则逐个替换字符串的效率低问题验证

2024年6月21日

问题

今天突然有个代码步骤变快了,之前要几分钟执行完成,突然十几秒就能结束,这两天只调整了用replaceAll替换字符串的地方,写了一段程序一测,还真是! 旧逻辑:近万条数据,每条可能要替换几百个字符,很耗时,每条都当做O(N) 新逻辑:每条先检查长度,要替换的字符超过6个直接换成"******",快,每条当做O(1) 艹昨天我还写正则预查哪哪好用,今天就打脸

测试代码

写代码测了下两种耗时,一万条String,每条替换中间的100个字符

java 复制代码
public class Main {
    public static void main(String[] args) {
        int size = 10000;//一万
        // 104个字符
        String s = "xx1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890xx";
        List<String> list = new ArrayList<>(size);
        for (int i = 0; i < size; i++) {
            list.add(s);
        }
        {
            long begin = System.currentTimeMillis();
            List<String> res = new ArrayList<>(size);
            list.forEach(item -> {
                String str = item.replaceAll("(?<=.{2}).(?=.{2})", "*");
                res.add(str);
            });
            long end = System.currentTimeMillis();
            System.out.println("正则替换:(?<=.{2}).(?=.{2}) 替换每个字符,耗时毫秒:" + (end - begin));
        }
        {
            long begin = System.currentTimeMillis();
            List<String> res = new ArrayList<>(size);
            list.forEach(item -> {
                String str = item.substring(0,4) + "******";
                res.add(str);
            });
            long end = System.currentTimeMillis();
            System.out.println("普通替换字符,耗时毫秒:" + (end - begin));
        }
    }
}

结果,正则替换250ms,截取替换只要3ms

java 复制代码
正则替换:(?<=.{2}).(?=.{2}) 替换每个字符,耗时毫秒:250
普通替换字符,耗时毫秒:3

时间差距不大,换成一百万条数据再试,一百万条数据每条替换100个字符,好,时间差了300倍:

java 复制代码
正则替换:(?<=.{2}).(?=.{2}) 替换每个字符,耗时毫秒:8221
普通替换字符,耗时毫秒:27

又试了下一万条条数据每条替换100*100个字符,正则替换数量级相近,普通替换只要2ms

java 复制代码
正则替换:(?<=.{2}).(?=.{2}) 替换每个字符,耗时毫秒:7292
普通替换字符,耗时毫秒:2

结论,replaceAll用正则逐个替换字符效率不太乐观,一万×一万个字符耗时7-8秒;普通替换字符串方法受数据量影响,但不是很大,都比较快

相关推荐
ShiJiuD6668889995 分钟前
Java stream流和方法引用
java·开发语言
专注前端30年35 分钟前
【Java微服务架构】Spring Cloud Alibaba全家桶实战:Nacos+Sentinel+Seata+分布式事务
java·微服务·架构
苏渡苇42 分钟前
轻量化AI落地:Java + Spring Boot 实现设备异常预判
java·人工智能·spring boot·后端·网络协议·tcp/ip·spring
追随者永远是胜利者1 小时前
(LeetCode-Hot100)64. 最小路径和
java·算法·leetcode·职场和发展·go
学习是生活的调味剂2 小时前
nacos原理之服务注册浅析
java·开发语言·nacos·注册中心
没有bug.的程序员2 小时前
Arthas 深度进阶:线上问题非侵入式诊断内核、方法级监控与线程阻塞排查实战指南
java·arthas·线上问题·非侵入式·方法级监控·线程阻塞
亓才孓2 小时前
[Mybatis]Mybatis框架
java·数据库·mybatis
跟Tom学编程—一对一编程辅导2 小时前
基于 Java 的 SSM 架构电子商城项目毕业设计课题选型指导文档|名企高级开发工程师全程一对一指导(含详细文档+源码+部署)
java·架构·毕业设计·课程设计
编程小风筝3 小时前
编写java代码如何写文档注释?
java·开发语言
与衫3 小时前
如何将SQLFlow工具产生的血缘导入到Datahub平台中
java·开发语言·数据库