前言
呵呵 最近的时候碰到了这样的一个问题
我使用 + 来进行字符串拼接, 拼接了之后 我想替换掉 整个字符串里面的 "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 这里只替换了最后一个
问题的分析
呵呵 最开始的时候 没有反应过来是 优先级 的问题
到后面 反应过来, 就觉得自己很蠢, 我们来看一下
如何 从规范中判断 "+" 的优先级 是低于 "xxx".replace 的呢
1. 从 "+" 开始
可以看到 MultiplicativeExpression 的优先级是高于 "+" 的
2. 看看 MultiplicativeExpression
可以看到 UnaryExpression 的优先级是比 MultiplicativeExpression 高的
3. 看看 UnaryExpression
可以看到 UnaryExpression 包含了 PostfixExpression
4. PostfixExpressions
可以看到 PostfixExpression 包含了 Primary
5. 看一下 Primary
Primary 里面包含了 MethodInvocation, 也就是诸如我们这里的 "xxx".replace
综上 "+" 的优先级是低于 "xxx".replace 的
因此 最终 test02DirectReplace 看到的效果如下
@Entity(name = "AuthRequest", codecFactoryClazz = XXXArrayBasedRequestCodecFactory.class)
public class EchoRequest extends XXXArrayBasedRequest {
字符串拼接的细节
规范中已经详细的说明了一些 特殊的 case, 可以参见规范
15.18.1. String Concatenation Operator +
完