猿问

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

我有以下测试:


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才能改变它?或者我在这里遗漏了一些其他细节?


千万里不及你
浏览 167回答 3
3回答

小怪兽爱吃肉

字符串是不可变的所以调用copyOfTemplate.replace(placeholder,&nbsp;"Hello!");没有将它分配给任何有效的东西什么都不做。它返回一个带有替换的新字符串,您忽略了它。任何半体面的 IDE 都会警告您这一点:此外,String copyOfTemplate = template也没有真正做任何事情。这不是副本。它只是一个指向相同底层字符串的新变量。没有方法可以复制字符串,因为字符串是不可变的,因此副本变得无用。你要String&nbsp;copyOfTemplate&nbsp;=&nbsp;template.replace(placeholder,&nbsp;"Hello!");我建议阅读有关字符串的Oracle 教程。您似乎错过了一些基础知识。

回首忆惘然

我在您的代码中看到两个主要问题:您对String#replace 的使用copyOfTemplate.replace(placeholder, "Hello!");返回一个新字符串,它不会更新它。您必须将其分配给一个新变量。最后的if声明if(!copyOfTemplate.equals(result));由于您添加了分号,因此 if 不执行任何操作,并且您始终可以访问该fail()方法。就好像你写道:if(!copyOfTemplate.equals(result))&nbsp;{ } 失败();

郎朗坤

请使用以下代码public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; final StringBuilder placeholder = new StringBuilder("$ph$");&nbsp; &nbsp; &nbsp; &nbsp; final StringBuilder template = new StringBuilder("<test>" + placeholder + "</test>");&nbsp; &nbsp; &nbsp; &nbsp; final StringBuilder result = new StringBuilder("<test>Hello!</test>");&nbsp; &nbsp; &nbsp; &nbsp; replaceString(template, placeholder.toString(), "Hello!");&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(template);&nbsp; &nbsp; }&nbsp; &nbsp; public static void replaceString(StringBuilder sb, String toReplace, String replacement) {&nbsp; &nbsp; &nbsp; &nbsp; int index = -1;&nbsp; &nbsp; &nbsp; &nbsp; while ((index = sb.lastIndexOf(toReplace)) != -1) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.replace(index, index + toReplace.length(), replacement);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }
随时随地看视频慕课网APP

相关分类

Java
我要回答