使用 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!");
我发现您的代码存在两个主要问题:
- 的使用
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);
}
}
我有以下测试:
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!");
我发现您的代码存在两个主要问题:
- 的使用
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);
}
}