【问题标题】:Using String.replace for copys of final Strings [duplicate]使用 String.replace 获取最终字符串的副本 [重复]
【发布时间】:2018-10-11 09:23:26
【问题描述】:

我有以下测试:

public void testStringReplace()
    {    
        final String placeholder = "$ph$";
        final String template = "<test>" + placeholder + "</test>";
        final String result = "<test>Hello!</test>";

        String copyOfTemplate = template;
        copyOfTemplate.replace(placeholder, "Hello!");

        if(!copyOfTemplate.equals(result));
            fail();
    }

测试总是失败,但为什么?我如何定义copyOfTemplate 才能更改它?还是我在这里遗漏了一些其他细节?

【问题讨论】:

  • copyOfTemplate = copyOfTemplate.replace(placeholder, "Hello!");
  • if(!copyOfTemplate.equals(result)); 去掉末尾的分号!

标签: java string replace immutability final


【解决方案1】:

字符串是不可变的,所以调用

copyOfTemplate.replace(placeholder, "Hello!");

如果没有有效地将其分配给任何东西,则什么也做不了。它返回一个带有替换的新字符串,您将忽略它。任何半体面的 IDE 都会警告您:

另外,String copyOfTemplate = template 也没有真正做任何事情。这不是副本。它只是一个指向相同底层字符串的新变量。没有复制字符串的方法,因为字符串是不可变的,因此副本变得无用。

你想要的

String copyOfTemplate = template.replace(placeholder, "Hello!");

我建议阅读Oracle tutorial on strings。您似乎错过了一些基础知识。

【讨论】:

    【解决方案2】:

    由于字符串是不可变的,opyOfTemplate.replace(placeholder, "Hello!"); 会生成一个新字符串。所以,你必须检查你的变量

    copyOfTemplate = copyOfTemplate.replace(placeholder, "Hello!");

    【讨论】:

      【解决方案3】:

      我在您的代码中发现了两个主要问题:

      • 您对String#replace的使用

        copyOfTemplate.replace(placeholder, "Hello!"); 返回一个新字符串,它不会更新它。您必须将其分配给一个新变量。

      • 最后的if 声明

        if(!copyOfTemplate.equals(result)); 因为你添加了一个分号,if 什么都不做,你总是会到达fail() 方法。就好像你写的:

        如果(!copyOfTemplate.equals(结果)){ } 失败();

      【讨论】:

        【解决方案4】:

        在下面的代码中注释了一些错误 -

         final String placeholder = "$ph$";
        final String template = "<test>" + placeholder + "</test>";
        final String result = "<test>Hello!</test>";
        
        String copyOfTemplate = template;
        copyOfTemplate = copyOfTemplate.replace(placeholder, "Hello!"); 
        // you cannot change existing object because string is immutable
        
        if(!copyOfTemplate.equals(result)) // semi colon removed
            fail();
        

        【讨论】:

          【解决方案5】:

          请使用以下代码

          public static void main(String[] args) {
          
                  final StringBuilder placeholder = new StringBuilder("$ph$");
                  final StringBuilder template = new StringBuilder("<test>" + placeholder + "</test>");
                  final StringBuilder result = new StringBuilder("<test>Hello!</test>");
          
                  replaceString(template, placeholder.toString(), "Hello!");
                  System.out.println(template);
          
              }
          
              public static void replaceString(StringBuilder sb, String toReplace, String replacement) {
                  int index = -1;
                  while ((index = sb.lastIndexOf(toReplace)) != -1) {
                      sb.replace(index, index + toReplace.length(), replacement);
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 2019-02-24
            • 2020-01-30
            • 2011-12-20
            • 2017-09-06
            • 1970-01-01
            • 2016-10-19
            • 1970-01-01
            • 1970-01-01
            • 2013-08-12
            相关资源
            最近更新 更多