96 “+“ 和 方法调用 的优先级问题导致的字符串拼接问题

前言

呵呵 最近的时候碰到了这样的一个问题  

我使用 + 来进行字符串拼接, 拼接了之后 我想替换掉 整个字符串里面的 "Auth" 字符串 

结果出现了这样的一个问题, 呵呵 刚看到这个问题的时候, 有点懵 

但是 其实是一个 算是比较简单的一个问题吧 

 

以下截图, 调试 基于 jdk8, jls8 

 

 

测试用例 

我这里的情况是 test02DirectReplace 

/*** Test21ReplaceString** @author Jerry.X.He* @version 1.0.0* @date 2021/11/20 9:14*/
public class Test21ReplaceString {// Test21ReplaceStringpublic static void main(String[] args) {test01IndirectReplace();System.out.println();test02DirectReplace();}// test01IndirectReplacepublic static void test01IndirectReplace() {String group = "connection";String lines ="@Entity(name = \"AuthRequest\", codecFactoryClazz = XXXArrayBasedRequestCodecFactory.class)\n" +"public class AuthRequest extends XXXArrayBasedRequest {";String mapped = lines.replace("Auth", "Echo");System.out.println(mapped);}// test01IndirectReplacepublic static void test02DirectReplace() {String group = "connection";String lines ="@Entity(name = \"AuthRequest\", codecFactoryClazz = XXXArrayBasedRequestCodecFactory.class)\n" +"public class AuthRequest extends XXXArrayBasedRequest {".replace("Auth", "Echo");String mapped = lines;System.out.println(mapped);}}

 

执行结果如下 

可以看到 我们这里 case1 是完整的将 Auth 替换为了 Echo 

但是 case2 这里只替换了最后一个 

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6JOd6aOOOQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

问题的分析

呵呵 最开始的时候 没有反应过来是 优先级 的问题 

到后面 反应过来, 就觉得自己很蠢, 我们来看一下  

如何 从规范中判断 "+" 的优先级 是低于 "xxx".replace 的呢 

 

1. 从 "+" 开始 

可以看到 MultiplicativeExpression 的优先级是高于 "+" 的 

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6JOd6aOOOQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

2. 看看 MultiplicativeExpression 

可以看到 UnaryExpression 的优先级是比 MultiplicativeExpression 高的 

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6JOd6aOOOQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

3. 看看 UnaryExpression 

可以看到 UnaryExpression 包含了 PostfixExpression

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6JOd6aOOOQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

4. PostfixExpressions 

可以看到 PostfixExpression 包含了 Primary 

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6JOd6aOOOQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

5. 看一下 Primary

Primary 里面包含了 MethodInvocation, 也就是诸如我们这里的 "xxx".replace 

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6JOd6aOOOQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

综上 "+" 的优先级是低于 "xxx".replace 的 

因此 最终 test02DirectReplace 看到的效果如下 

@Entity(name = "AuthRequest", codecFactoryClazz = XXXArrayBasedRequestCodecFactory.class)
public class EchoRequest extends XXXArrayBasedRequest {

 

 

字符串拼接的细节

规范中已经详细的说明了一些 特殊的 case, 可以参见规范 

15.18.1. String Concatenation Operator +

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6JOd6aOOOQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

完 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/499183.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型量化技术原理-SmoothQuant

近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,从而导致模型变得越来越大,因此,我们需要一些大模型压缩技术来降低模型部署的成本,并提升模型的推理性能。 模型压缩主要分…

Linux:Makefile的相关知识

背景: 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复…

【C#】忽略大小的替换字符串

结果 代码 string a"aAAAAAAaBBaaCC"; string b Strings.Replace(a, "a", "D", 1, -1, CompareMethod.Text);

力扣:35. 搜索插入位置

力扣:35. 搜索插入位置 描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,…

手把手教你如何使用ESP8266(ESP-01S)连接到阿里云物联网平台,并通过微信小程序控制设备(如灯的亮、灭、数据上报到微信中显示)

前言 最近在做智能家居的项目,主要是通过esp8266接入云端实现远程控制的效果,于是就想到用微信小程序进行控制。由于阿里云物联网平台为设备提供安全可靠的连接通信能力,向下连接海量设备,支撑设备数据采集上云;向上提…

答应我,在vue中不要滥用watch好吗?

前言 上周五晚上8点,开开心心的等着产品验收完毕后就可以顺利上线。结果产品突然找到我说要加需求,并且维护这一块业务的同事已经下班走了,所以只有我来做。虽然内心一万头草泥马在狂奔,但是嘴里还是一口答应没问题。由于这一块业…

web前端-html表单元素

文章目录 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>周鑫的</title></head> <body> <form action"06、内联框架.html" method"get"><h1>登录…

江科大stm32学习笔记——【4-1】OLED

一.原理 1.调试方式 串口调试&#xff1a;通过串口通信&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手显示调试信息。 显示屏调试&#xff1a;直接将显示屏连接到单片机&#xff0c;将调试信息打印在显示屏上。 Keil调试模式&#xff1a;借助Keil软件的调…

Vite 构建的 Vue3 项目如何整合 Monaco Editor 代码编辑器

目录 &#x1f981; 一. 前言&#x1f981; 二. 探索过程2.1 安装2.2 配置 Monaco Editor2.3 编写 Monaco Editor 代码编辑器2.3.1 创建 Coding Editor 组件2.3.2 父组件使用 CodingEditor 组件 2.4 效果展示 三. 总结 &#x1f981; 一. 前言 各位好&#xff01;我是&#x1…

Unity绘制六边形体

现在steam上面有很多下棋类/经营类的游戏都是用六边形的地形&#xff0c;比较美观而且实用&#xff0c;去年在版本末期我也自己尝试做了一个绘制六边体的demo&#xff0c;一年没接触unity竟然都要忘光了&#xff0c;赶紧在这边记录一下。 想cv代码可以直接拉到代码章节 功能 …

面试官:谈一谈Cookie和Session的区别?

我先解释一下Cookie&#xff0c;它是客户端浏览器用来保存服务端数据的一种机制&#xff0c;当我们通过浏览器去进行网页访问的时候&#xff0c;服务器可以把一些状态数据以key-value的形式写入到Cookie里面&#xff0c;存储到客户端浏览器。下一次这个浏览器再访问服务器的时候…

JavaEE——简单认识JavaScript

文章目录 一、简单认识 JavaScript 的组成二、基本的输入输出和简单语法三、变量的使用四、JS 中的动态类型图示解释常见语言的类型形式 五、JS中的数组六、JS 中的函数七、JS 中的对象 一、简单认识 JavaScript 的组成 对于 JavaScript &#xff0c;其中的组成大致分为下面的…