我有以下测试:
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
才能进行更改?还是我在这里错过了其他细节?
答案 0 :(得分:3)
字符串是不可变的,因此调用
copyOfTemplate.replace(placeholder, "Hello!");
如果不将其有效地分配给任何东西,则无济于事。它返回一个带有替换的新字符串,您将忽略它。任何不雅观的IDE都会警告您以下内容:
此外,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)
我在您的代码中看到两个主要问题:
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);
}
}