【问题标题】:what is the different between string and stringbuilder in the code? [duplicate]代码中的 string 和 stringbuilder 有什么区别? [复制]
【发布时间】:2017-11-29 01:06:05
【问题描述】:

我想知道为什么这段代码的输出是“roar roar!!!”不是“吼!!!吼!!!”? 代码是:

 public class Lion 
 {
   public void roar(String roar1, StringBuilder roar2) {
   roar1.concat("!!!");
   roar2.append("!!!");
 }
 public static void main(String[] args)
{
  String roar1 = "roar";
  StringBuilder roar2 = new StringBuilder("roar");
  new Lion().roar(roar1, roar2);
  System.out.println(roar1 + " " + roar2);
} }

我试图找出方法 concat() 不将一个字符串附加到另一个字符串的原因。请解释一下。

【问题讨论】:

  • 字符串是不可变的,参见javadocs

标签: java


【解决方案1】:

这里 roar1 是你的字符串变量,而 roar2 是你的类字符串生成器的对象,只有字符串生成器是可变的,字符串不能被变异....因为只有类字符串生成器 concate 中的内置函数才能对其起作用对象咆哮2。

Roar1 不是字符串生成器的对象,因此 concate 函数将无法对其起作用。

【讨论】:

  • String 提供创建新实例的方法,而不是修改实例本身,因为它是不可变的。所以你的最后一句话是不正确的。其余的,我很难理解一半的答案。请使用一些标签,如果可以,请尝试更正自己
  • 我是说,因为 roar1 是变量而不是字符串生成器类的对象,连接函数仅适用于字符串生成器对象,不适用于原始数据类型。
【解决方案2】:

如前所述,String 类的对象始终是不可变的。 此外,您必须记住 JAVA 中的变量是如何传递给某些方法的。 在您的情况下,您构建一个 String 和一个 StringBuilder 并将它们传递给您的 roar() 方法。 JVM 将创建两个引用两个原始对象的新变量。由于本地字符串变量的不可变性,如果您想更改此对象,将创建一个新对象。字符串对象的 append() 方法通常会创建并返回一个新的字符串实例,其中包含您所做的更改。您没有对此对象的引用。即使您的本地字符串引用了这个对象,roar() 方法之外的字符串变量仍然引用旧的字符串(“roar”)。 这就是为什么您的 System.out.println 没有显示您所做的更改的原因。

【讨论】:

  • Your Local Variable is referencing this new String ("roar!!!") 这是不正确的。再次阅读代码;)但即使编写正确,您也没有错。
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 2011-02-24
  • 2022-01-13
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
相关资源
最近更新 更多