【问题标题】:JAVA String vs StringBufferJAVA 字符串与字符串缓冲区
【发布时间】:2013-07-10 21:53:32
【问题描述】:

下面是让我困惑的程序。下面程序的输出是

 The USA 
main USA

如果我将所有 String 替换为 StringBuffer,那么我会得到 "The USA main The USA"。请帮助我理解这一点。

 public class Confusing {
    public static void sss(String s1){
        s1= "The "+s1;
        System.out.println(s1);
    }

    public static void main(String args[]){
        String s1 = new String("USA");

        sss(s1);
        System.out.println("main "+s1);
    }
}

【问题讨论】:

  • String 的情况下,在sss 中,您只能在sss 的范围内修改s1。如果你使用StringBuffer,你会在StringBuffer 中添加一些东西……这里的关键字是Java 中String 的不变性……
  • 好的,如果我把它设为“The”+s1;而不是 s1 = ""+s1;那么我们可以说它是由于不变性。无论如何,我在 StringBuffer 和 String 情况下都只传递引用“s1”。我还是很困惑。
  • 但是你向 StringBuffer 对象添加了一些东西(我猜是 .append)。因为您只传递了对该对象的引用,所以此更改在 main 中也可见。
  • 所以你的意思是说如果我传递 String s1 那么我是通过值传递,如果我传递 StringBuffer s1 它是通过引用传递?
  • 基本上,对于 StringBuffer,javac 将 = 的语义与引用接收器抛出窗口并修改对象与修改引用。 (呻吟!)

标签: string object reference stringbuffer


【解决方案1】:

正确的做法是这样的:

public class Confusing {

  public static void sss(StringBuffer s1){
      StringBuffer the= new StringBuffer("the ");

      System.out.println(the.append(s1));
  }

  public static void main(String args[]){
      StringBuffer s1 = new StringBuffer("USA ");

      sss(s1);
      StringBuffer main = new StringBuffer("main ");
      System.out.println(main.append(s1));
 }
}

输出是:

the USA 
main USA 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多