Java 对最终字符串的副本使用String.replace
我有以下测试:Java 对最终字符串的副本使用String.replace,java,string,replace,immutability,final,Java,String,Replace,Immutability,Final,我有以下测试: public void testStringReplace() { final String placeholder = "$ph$"; final String template = "<test>" + placeholder + "</test>"; final String result = "<test>Hello!</test>"; Str
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();
}
public void testStringReplace()
{
最后一个字符串占位符=“$ph$”;
最终字符串模板=“占位符+”;
最终字符串结果=“你好!”;
字符串copyOfTemplate=模板;
替换(占位符“Hello!”);
如果(!copyOfTemplate.equals(result));
失败();
}
测试总是失败,但为什么?我必须如何定义
copyOfTemplate
,才能更改它?还是我在这里遗漏了一些其他细节?字符串是不可变的,所以调用
copyOfTemplate.replace(placeholder, "Hello!");
如果不将其分配给任何对象,那么实际上什么都做不了。它返回一个包含替换项的新字符串,您将忽略它。任何半体面的IDE都会警告您:
而且,String copyOfTemplate=template
也没有什么作用。这不是副本。它只是一个指向相同基础字符串的新变量。没有复制字符串的方法,因为字符串是不可变的,所以副本变得无用
你想要
String copyOfTemplate = template.replace(placeholder, "Hello!");
我建议你读这本书。似乎您错过了一些基本知识。字符串是不可变的,所以调用
copyOfTemplate.replace(placeholder, "Hello!");
如果不将其分配给任何对象,那么实际上什么都做不了。它返回一个包含替换项的新字符串,您将忽略它。任何半体面的IDE都会警告您:
而且,String copyOfTemplate=template
也没有什么作用。这不是副本。它只是一个指向相同基础字符串的新变量。没有复制字符串的方法,因为字符串是不可变的,所以副本变得无用
你想要
String copyOfTemplate = template.replace(placeholder, "Hello!");
我建议你读这本书。您似乎错过了一些基础知识。由于字符串是不可变的,
opyOfTemplate.replace(占位符“Hello!”)代码>生成一个新字符串。因此,您必须检查您的变量
copyOfTemplate=copyOfTemplate.replace(占位符“Hello!”)代码>由于字符串是不可变的,opyOfTemplate.replace(占位符“Hello!”)代码>生成一个新字符串。因此,您必须检查您的变量
copyOfTemplate=copyOfTemplate.replace(占位符“Hello!”)代码>我发现您的代码中存在两个主要问题:
- 你使用
copyOfTemplate.replace(占位符“Hello!”)代码>返回一个新字符串,它不会更新它。您必须将其分配给一个新变量
- 末尾的
if
语句
if(!copyOfTemplate.equals(result))
由于添加了分号,if将不执行任何操作,并且始终会到达fail()
方法。就像你写的:
if(!copyOfTemplate.equals(result)) {
}
fail();
如果(!copyOfTemplate.equals(结果)){
}
失败();
我发现您的代码中存在两个主要问题:
- 你使用
copyOfTemplate.replace(占位符“Hello!”)代码>返回一个新字符串,它不会更新它。您必须将其分配给一个新变量
- 末尾的
if
语句
if(!copyOfTemplate.equals(result))
由于添加了分号,if将不执行任何操作,并且始终会到达fail()
方法。就像你写的:
if(!copyOfTemplate.equals(result)) {
}
fail();
如果(!copyOfTemplate.equals(结果)){
}
失败();
评论了下面代码中的一些错误-
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();
最终字符串占位符=“$ph$”;
最终字符串模板=“占位符+”;
最终字符串结果=“你好!”;
字符串copyOfTemplate=模板;
copyOfTemplate=copyOfTemplate.replace(占位符“Hello!”);
//无法更改现有对象,因为字符串是不可变的
如果(!copyOfTemplate.equals(result))//删除分号
失败();
评论了下面代码中的一些错误-
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();
最终字符串占位符=“$ph$”;
最终字符串模板=“占位符+”;
最终字符串结果=“你好!”;
字符串copyOfTemplate=模板;
copyOfTemplate=copyOfTemplate.replace(占位符“Hello!”);
//无法更改现有对象,因为字符串是不可变的
如果(!copyOfTemplate.equals(result))//删除分号
失败();
请使用下面的代码
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);
}
}
publicstaticvoidmain(字符串[]args){
最终StringBuilder占位符=新StringBuilder($ph$);
最终StringBuilder模板=新StringBuilder(“+占位符+”);
最终StringBuilder结果=新建StringBuilder(“你好!”);
replaceString(模板,占位符.toString(),“Hello!”);
System.out.println(模板);
}
公共静态void replaceString(StringBuilder sb、字符串替换、字符串替换){
int指数=-1;
而((索引=sb.lastIndexOf(toReplace))!=-1){
替换(索引,索引+替换长度(),替换);
}
}
请使用下面的代码
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);
}
}
publicstaticvoidmain(字符串[]args){
最终StringBuilder占位符=新StringBuilder($ph$);
最终StringBuilder模板=新StringBuilder(“+占位符+”);
最终StringBuilder结果=新建StringBuilder(“你好!”);
replaceString(模板,占位符.toString(),“Hello!”);
System.out.println(模板);
}
公共静态void replaceString(StringBuilder sb、字符串替换、字符串替换){
int指数=-1;
而((索引=sb.lastIndexOf(toReplace))!=-1){
替换(索引,索引+替换长度(),替换);
}
}
copyOfTemplate=copyOfTemplate.replace(占位符“Hello!”)<代码>如果(!copyOfTemplate.equals(result))代码>copyOfTemplate=copyOfTemplate.replace(占位符“Hello!”)<代码>如果(!copyOfTemplate.equals(result))代码>