使用String.replace复制最终字符串

时间:2018-10-11 09:23:27

标签: java string replace immutability final

我有以下测试:

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才能进行更改?还是我在这里错过了其他细节?

5 个答案:

答案 0 :(得分:3)

字符串是不可变的,因此调用

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

如果不将其有效地分配给任何东西,则无济于事。它返回一个带有替换的新字符串,您将忽略它。任何不雅观的IDE都会警告您以下内容:

IDE warning

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

您想要

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

我建议阅读Oracle tutorial on strings。看来您已经错过了一些基本知识。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我在您的代码中看到两个主要问题:

  • 您使用String#replace

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

  • 最后的if语句

    if(!copyOfTemplate.equals(result));由于添加了分号,因此if不会执行任何操作,并且始终会到达fail()方法。就像你写的一样:

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

答案 3 :(得分:0)

评论了下面代码中的一些错误-

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

答案 4 :(得分:0)

请使用以下代码

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