Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对最终字符串的副本使用String.replace_Java_String_Replace_Immutability_Final - Fatal编程技术网

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