【问题标题】:String is immutable? [duplicate]字符串是不可变的? [复制]
【发布时间】:2019-10-15 01:33:48
【问题描述】:

只是有个问题,我们如何重写上面的代码,只创建一个String对象?

String 是不可变的,studentDetails 已经不是一个 String 对象了

public void displayString(Student[] students)
{
   String studentDetails = "";
   for (Student stu : students)
   {
       studentDetails += stu.getFirstName();
       studentDetails += " ";
       studentDetails += stu.getLastName();
       studentDetails += " ";
       studentDetails += stu.getAge();
       studentDetails += "\n";  
   }
   System.out.println("Student Details are: ");
   System.out.println(studentDetails);
}

【问题讨论】:

标签: java string


【解决方案1】:

String object 是不可变的,而 variable studentDetails 不是。

当您调用studentDetails += stu.getFirstName() 时,您创建了一个新的String 对象 并将其分配给变量 studentDetails

【讨论】:

    【解决方案2】:

    使用StringBuilder:

    public void displayString(Student[] students)
    {
       StringBuilder studentDetails = new StringBuilder();
       for (Student stu : students)
       {
           studentDetails.append(stu.getFirstName());
           studentDetails.append(' ');
           studentDetails.append(stu.getLastName());
           studentDetails.append(' ');
           studentDetails.append(stu.getAge());
           studentDetails.append('\n');  
       }
       System.out.println("Student Details are: ");
       System.out.println(studentDetails.toString());
    }
    

    String 是不可变的,studentDetails 已经不是一个 String 对象了

    不,因为每次将两个Strings 与+= 附加时,都会创建一个新的String

    【讨论】:

    • 这个原则是合理的,但会创建 4 个 String 对象,而不是一个。 (编辑:不确定 OP 创建单个 String 对象的规范是否可能有点 XY)。
    • @Mena 是的,我注意到了这一点,并用字符替换了单个字符串。尽管如此,还是会有第二个String(“学生详细信息是:”)。我认为避免这种情况的唯一方法是一次将那个常量字符串的字符附加到 StringBuilder 的开头,但这太荒谬了。
    • @Mena 我只看到一个。你是怎么数的?
    • @kumesana 在最新版本的答案中有两个(请参阅上面的 Eran 评论)。在以前的版本中,字符文字是 String 文字。所以你有一个用于空格,一个用于换行符,一个用于“学生详细信息...”,一个用于toString 调用。
    • 那些是文字,不是在运行这段代码时真正创建的......我想这是一个语义问题。
    【解决方案3】:

    字符串是不可变的 - 请改用 StringBuilderStringBuffer(线程安全)

    public void displayString(Student[] students)
    {
       StringBuilder studentDetails = new StringBuilder();
       for (Student stu : students)
       {
           studentDetails.append(stu.getFirstName());
           studentDetails.append(" ");
           studentDetails.append(stu.getLastName());
           studentDetails.append(" ");
           studentDetails.append(stu.getAge());
           studentDetails.append("\n");  
       }
       System.out.println("Student Details are: ");
       System.out.println(studentDetails.toString());
    }
    

    【讨论】:

    • 同步在这里没用。首选 StringBuilder。
    【解决方案4】:

    是的,String 对象是不可变的,这就是为什么需要使用StringBuilderStringBuffer。以下是显示使用StringBuilder的步骤

    • 创建StringBuilder 类型的变量
    • 使用append()方法连接String
    • 调用toString()将其转换为String

    【讨论】:

      【解决方案5】:

      是的,字符串是不可变的,只需使用 StringBuilder,如果需要线程安全,则使用 stringBuffer....

         StringBuilder studentDetails = "";
         for (Student stu : students)
         {
             studentDetails.append(stu.getFirstName());
             studentDetails.append(" ");
             studentDetails.append(stu.getLastName());
             studentDetails.append(" ");
             studentDetails.append(stu.getAge());
             studentDetails.append("\n");  
         }
      

      【讨论】:

        【解决方案6】:

        是的,java中的字符串对象是不可变的。 字符串中的任何更改都将创建新的字符串对象。 而 stringBuilder 和 StringBuffer 是可变的

        【讨论】:

          猜你喜欢
          • 2013-05-08
          • 1970-01-01
          • 2015-07-02
          • 1970-01-01
          • 1970-01-01
          • 2015-03-30
          • 2021-07-22
          • 2012-04-22
          • 2011-03-24
          相关资源
          最近更新 更多