replace/replaceAll

在leetcode刷到替换空格的问题,一通反复比较,发现String对象中的replace和replaceAll虽然实现效果相同,但是执行用时和内存消耗略有差异;Be Like:


难道说底层实现有哪里不一样?让我来康康源码(JDK8下);

emmmm…可以看出String.replace() 和 String.replaceAll() 调用的方法是一样的,都调用了Matcher.replaceAll() 方法;那就是他们调用的方式不同啦;可以看到replaceAll() 方法没有传入参数 “Pattern.LITERAL”;
再来康康 “Pattern.LITERAL”是如何起作用?

咱就是说,既然compile()里面的不同,咱就一层一层往下翻:
图放不下了,这是compile的源码:

  private void compile() {// Handle canonical equivalencesif (has(CANON_EQ) && !has(LITERAL)) {normalize();} else {normalizedPattern = pattern;}patternLength = normalizedPattern.length();// Copy pattern to int array for convenience// Use double zero to terminate patterntemp = new int[patternLength + 2];hasSupplementary = false;int c, count = 0;// Convert all chars into code pointsfor (int x = 0; x < patternLength; x += Character.charCount(c)) {c = normalizedPattern.codePointAt(x);if (isSupplementary(c)) {hasSupplementary = true;}temp[count++] = c;}patternLength = count;   // patternLength now in code pointsif (! has(LITERAL))RemoveQEQuoting();// Allocate all temporary objects here.buffer = new int[32];groupNodes = new GroupHead[10];namedGroups = null;if (has(LITERAL)) {// Literal pattern handlingmatchRoot = newSlice(temp, patternLength, hasSupplementary);matchRoot.next = lastAccept;} else {// Start recursive descent parsingmatchRoot = expr(lastAccept);// Check extra pattern charactersif (patternLength != cursor) {if (peek() == ')') {throw error("Unmatched closing ')'");} else {throw error("Unexpected internal error");}}}// Peephole optimizationif (matchRoot instanceof Slice) {root = BnM.optimize(matchRoot);if (root == matchRoot) {root = hasSupplementary ? new StartS(matchRoot) : new Start(matchRoot);}} else if (matchRoot instanceof Begin || matchRoot instanceof First) {root = matchRoot;} else {root = hasSupplementary ? new StartS(matchRoot) : new Start(matchRoot);}// Release temporary storagetemp = null;buffer = null;groupNodes = null;patternLength = 0;compiled = true;}

引用: 浅析Java正则中的Pattern和Matcher两个类.

在compile()方法中,创建的matchRoot和root对象很关键,是后面执行matches()方法和find()方法的基础。
而matchRoot对象是通过expr(lastAccept)方法创建的,传参lastAccept为LastNode实例。

我们可以看到源码中有一行:matchRoot = expr(lastAccept);执行此方法,就开始进行正则表达式的匹配。

源码通过if-else来判断,参数 regex 是不是一个正则表达式:

  • 如果是正则,执行正则替换;
  • 如果是字符串,执行字符串替换,此时和 replace() 就是一样的了。

搞明白了底层的不同,还是不明白正则替换的效率为什么会比字符替换的效率低?以及该选择哪个使用呢?
String.replace()和String.replaceAll()性能对比

在这篇博客中指出:两个API的使用场景不同。replaceAll()的功能更强大一些。同时,因为replaceAll()需要处理正则表达式,性能上应该会弱于replace()。

But!!!
jdk8环境下,java字符串使用replace()和replaceAll()方法性能对比

陷入了沉思
自己尝试这篇博客的代码


好吧,甚至差异更大;不知道是版本的问题还是有没有注意到的细节;

个人觉得简单替换可以使用replace(),更加复杂的功能实现可以使用replaceAll();

replace/replaceAll相关推荐

  1. java replace会替换吗,java replace replaceAll 替换字符串的用法和区别实例

    java replace replaceAll 是替换字符串最常用的方法,但实际上用法是有区别的,replace只能传字符不能传正则表达式,replaceAll 默认传入的就是正则表达式.下面是实例测 ...

  2. 【总结】字符串的遍历,replace(),replaceAll()方法的使用

    ①字符串的遍历:// 方法一:使用charAt(i):遍历字符串的每个元素,每个元素是字符的形式for(int i=0;i < str.length();i++) {System.out.pri ...

  3. js replace replaceAll

    字符串.replace(new RegExp(要查找的字符, 'g'),要替换的字符) 转载于:https://my.oschina.net/u/1389061/blog/505080

  4. Java后端进行经纬度点抽稀聚合,HTML呈现及前端聚合实现点聚合~

    Java后端进行经纬度点抽稀聚合,HTML呈现及前端聚合实现点聚合~ 1. 效果图~ 1.1 前端实现聚合及呈现 1.2 后端实现点聚合,前端渲染呈现效果图 2. 原理 3. 源码 3.1 前端JS实 ...

  5. java文字转pdf格式_java根据富文本生成pdf文件

    public classPdfUtil {/** 生成pdf工具类 * wmy 12:40 2019/8/9 * @Param [guideBook, pdfPath] * @return java. ...

  6. Java8 Map中新增的方法使用总结

    前言 得益于 Java 8 的 default 方法特性,Java 8 对 Map 增加了不少实用的默认方法,像 getOrDefault, forEach, replace, replaceAll, ...

  7. 基于SpringJDBC 实现关键功能-EntityOperation

    /*** 实体对象的反射操作*/ public class EntityOperation<T> {private Logger log = Logger.getLogger(Entity ...

  8. 设计模式(一)Chain Of Responsibility责任链模式

    设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser {S ...

  9. java基本特性_Java面试总结之Java基础

    无论是工作多年的高级开发人员还是刚入职场的新人,在换工作面试的过程中,Java基础是必不可少的面试题之一.能不能顺利通过面试,拿到自己理想的offer,在准备面试的过程中,Java基础也是很关键的.对 ...

最新文章

  1. alert三秒后关闭_疏通经络后,感觉很疲倦是什么情况?
  2. SQL Server 2012入门T-SQL基础篇:(1)环境准备
  3. ocm名单 oracle_oracle_ocm
  4. tf.placeholder使用错误
  5. blank space in latex math environment
  6. springboot(三)-使用JSP
  7. Vim 实用技术,第 1 部分: 实用技巧(转)
  8. 东北三省计算机专业好的学校,东北地区哪个大学比较好 各自的王牌专业是什么...
  9. 2021-02-13
  10. android7+预装+卸载,国内安卓用户救星:7月1日起,手机预装App必须支持卸载!
  11. 计算机网络的文件怎么删除,教你一招如何删除Win7电脑中的顽固文件
  12. 小米笔记本装linux教程视频教程,手把手教你加装SSD,让小米笔记本运行更加666!...
  13. ASP.NET 安全认证(二)【转】
  14. php 微信开发 网页授权登录,微信开发网页授权登录——2018年6月2日
  15. 计算机绘制表格教案,word中插入表格教案
  16. 利用Python程序实现图片颜值打分
  17. 【Try to Hack】Kerberos基础
  18. 电大计算机网考攻略,上海开放大学毕业通关秘籍
  19. 垃圾渗滤液除氨氮深度处理膜后除氨氮用离子交换树脂
  20. R语言——多元线性回归

热门文章

  1. 港科夜闻|第11次EMBA排名全球第一!!香港科大与凯洛格合办的Kellogg-HKUST EMBA课程再登全球首位...
  2. Mac终端operation not permitted问题
  3. 华为Python机试
  4. 使用Flurl轻松构建URL并在.NET中进行可测试的HttpClient调用
  5. Vue为何弃用经典的Ajax,选择新技术Axios?
  6. Python 求阶乘
  7. 乔戈里最爱的十大博客,你有看吗?
  8. android xutils 教程,Android AS为xutils添加依赖过程图解
  9. 机器学习中的性能指标:精度、召回率,PR曲线,ROC曲线和AUC,及示例代码
  10. 华翔天诚晨控科技面向推出的一款“跨界”传感器,广泛应用AGⅤ行业