replace/replaceAll

article/2025/9/21 6:08:03

replace/replaceAll

在leetcode刷到替换空格的问题,一通反复比较,发现String对象中的replace和replaceAll虽然实现效果相同,但是执行用时和内存消耗略有差异;Be Like:
在这里插入图片描述
在这里插入图片描述
难道说底层实现有哪里不一样?让我来康康源码(JDK8下);
在这里插入图片描述

replace

replaceAll

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();


http://chatgpt.dhexx.cn/article/OaV86WEi.shtml

相关文章

如何使用Node.js REPL

目录 1、Nodejs REPL 2、_特殊变量 3、向上箭头键 4、点命令 5、从JavaScript文件运行REPL 1、Nodejs REPL REPL代表Read-Evaluate-Print-Loop&#xff0c;是交互式解释器。 node命令是我们用来运行Node.js脚本的命令&#xff1a; node script.js 如果我们运行node命令…

Node.js的交互式解释器(REPL)

什么是交互式解释器 交互式解释器&#xff0c;就是交互的解释器&#xff0c;即每输入一行然后回车都会有所反应。 必要时可以拿node当计算器来使用。 REPL(Read Eval Print Loop:交互式解释器)表示一个电脑的环境&#xff0c;类似于电脑的cmd命令行&#xff0c;我们可以在其…

简单说说USB协议(三)四种传输方式

数据传输的大致步骤&#xff1a; 配置传输方法——选择事务——发送各种令牌、数据、握手包 传输方法 既然USB是用来进行数据传输的&#xff0c;那么必然会涉及到配置传输方法&#xff1a; 批量传输、中断传输、同步传输、控制传输。 1、批量传输 适用于数据量大&#xf…

USB协议详解第12讲(USB传输-初探)

目录 1.USB传输、事务、包的关系 2.USB传输类型 2.1控制传输 2.2同步传输 2.3批量传输 2.4中断传输 3.传输总结及后期内容 1.USB传输、事务、包的关系 USB传输、事务、包是从不同层次上去说明一次数据交互的三个概念。 举个例子可能更好些&#xff0c;"某领导和一…

USB 协议的科普

旧名称 新名称 最新名称 最大速度 2000.04 USB 2.0 480 Mbps 2008.11 USB 3.0 USB 3.1 Gen1 USB 3.2 Gen1 5 Gbps 2013.12 USB 3.1 USB 3.1 Gen2 USB 3.2 Gen2 10 Gbps 2017.09 USB 3.2 USB 3.2 Gen2x2 20 Gbps 英特尔 雷电 3 USB-C Thunder…

USB协议详解第1讲(核心概念通俗理解)

目录 0.概括 1.USB传输&#xff08;Transfer&#xff09; 2.事务&#xff08;Transaction&#xff09; 3.包&#xff08;Pack&#xff09;的概念 4.USB 主机&#xff08;Host&#xff09; 5.设备&#xff08;Device&#xff09; 6.配置&#xff08;Configuration&#x…

USB协议基本知识

USB 基本知识 USB的重要关键概念: 1、 端点&#xff1a;位于USB设备或主机上的一个数据缓冲区&#xff0c;用来存放和发送USB的各种数据&#xff0c;每一个端点都有惟一的确定地址&#xff0c;有不同的传输特性&#xff08;如输入端点、输出端点、配置端点、批量传输端点&…

USB协议分析仪

1 ULPI PHY passive sniffing mode 概念: non driving, no pull-up, no pull-down Function Control.opMode 1; // non-Driving OTG Control.DpPulldown 0; // no pull-down OTG Control.DmPulldown 0; // no pull-down USB IO.ChargerPullupEnDP 0; // no pull-up USB IO.…

usb协议栈概述

usb协议栈概述 usb协议栈的信息源头是www.usb.org usb协议栈的所有者是usb联盟。它有七个美国公司为它的成员 这些公司包括苹果&#xff0c;惠普&#xff0c;英特尔&#xff0c;微软&#xff0c;瑞萨科技&#xff0c;ST微电子&#xff0c;德州仪器 usb的版本发展 从1.0&#…

USB协议-描述符篇(一)

USB协议-描述符篇&#xff08;一&#xff09; 1.USB描述符简介2.USB标准描述符2.1 设备描述符2.2 配置描述符2.3 接口描述符2.4 端点描述符2.5 字符串描述符 3.特殊类描述符4.USB类定义5.USBDescriptorType 1.USB描述符简介 USB描述符&#xff0c;即使用描述符报告它们的属性。…

USB协议 - UVC标准协议规范(二)

USB协议-UVC标准协议规范&#xff08;二&#xff09; 1.概述2.UVC功能特征2.1 Video Interface Class2.2 Video Interface subclass and Protocol2.3 UVC功能拓扑2.3.1 Unit单元2.3.1.1 SU(选择器单元)2.3.1.2 PU(处理单元)2.3.1.3 EU&#xff08;编码单元&#xff09;2.3.1.4 …

USB 协议整理 五:USB概述及协议基础(四)

十一、USB 的四种传输类型 1、批量传输 详细内容见 《USB2.0标准协议》 8.5.2 Bulk Transactions 章节。 批量事务类型的特点是能够通过错误检测和重试来保证在主机和设备之间无错误地传递数据。批量事务使用由令牌、数据和握手数据包组成的三阶段事务&#xff0c;如图 8-30…

USB总线-USB协议简介(一)

1.简介 USB是通用串行总线&#xff08;Universal Serial Bus&#xff09;的缩写。在USB总线出现之前&#xff0c;计算机与键盘、鼠标、扫描仪、打印机都使用专用的接口连接&#xff0c;不同设备的接口不能互用&#xff0c;扩展性很差&#xff0c;每次插拔设备都要关闭计算机&a…

USB 协议整理 二:USB概述及协议基础(一)

一、USB 版本 二、USB是什么 USB是一种接口技术&#xff0c;真正的即插即用&#xff0c;英文全称是Universal Serial Bus&#xff0c;USB就是简写&#xff0c;中文叫通用串行总线。USB 的出现简化了个人计算机与外围设备的连接&#xff0c;增加了易用性。 USB 是主从模式。 …

强大的USB协议分析工具

2020年最后一天了&#xff0c;感谢大家一年来对我文章的支持&#xff0c;有你们的支持就是我强大的动力。 今天来给大家介绍一个USB 协议分析软件LeCroy USB Advisor&#xff0c;软件安装包下载连接如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/12qBCOjuy4i8kr1M…

USB 充电协议

文章目录 锂电子电池电池的发展史锂电子电池充电过程充电物理公式充电器接口 USB协议慢充USB-IF BC1.2 快充QCOM QCOPPO VOOCUSB-IF PDMTK PE USB 充电市场 锂电子电池 电池的发展史 USB充电,都是充的 锂离子电池https://blog.csdn.net/u012719256/article/details/72627022 …

USB 协议分析(含基本协议和 USB 请求和设备枚举)

1. 物理特性 1.1 引脚 一条USB传输线分别由地线、电源线、D和D-四条线构成&#xff0c;D和D-是差分输入线&#xff0c;它使用的是3.3V的电压(与CMOS的5V电平不同)&#xff0c;而电源线和地线可向设备提供5V电压&#xff0c;最大电流为500mA(可以在编程中设置)。 引脚标号信号名…

1.USB协议简介

最近学习usb相关的知识&#xff0c;一直感觉入不了门&#xff0c;看《linux那些事儿之我是usb》&#xff0c;对usb协议也不是很熟悉&#xff0c;没能坚持看下去&#xff0c;直到看了《圈圈教你玩usb》一书&#xff0c;把自己的兴趣立马提了起来&#xff0c;大牛圈圈用51单片机实…

USB协议基础篇

初次接触USB的同学&#xff0c;可能会被里面各种名词给搞晕&#xff0c;下面就来梳理一下这些知识&#xff0c;希望能帮助大家理解USB。 目录 一&#xff0c;从最常见的名词说起 1.1 什么是USB 1.2 USB协议版本 1.3 USB接口分类 1.4 PIPE 1.5 endpoint 1.6 管道通信方式…

USB协议简介

1.USB协议简介 https://blog.csdn.net/songze_lee/article/details/77658094 2017年08月28日 23:20:16 songze_lee 阅读数&#xff1a;22978 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/songze_lee/article/details/7…