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

Using String.replace for copys of final Strings

我有以下测试:

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.replace(placeholder, "Hello!");

没有将它分配给任何有效的东西。它 returns 一个带有替换的新字符串,您忽略了它。任何半正经的 IDE 都会警告你:

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

你想要

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

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

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

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

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

  • 您对String#replace

    的使用

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

  • 最后的if语句

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

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

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

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

请使用以下代码

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