关于Java StringBuffer如何工作的困惑?

时间:2014-10-15 01:26:08

标签: java stringbuffer

我现在正在完成一项任务,并对此感到困惑。给出的代码很简单:

public class Variables{
    public static void main(String[ ] args){
        StringBuffer b = "ghi";
        f(b);
        System.out.println(b):
    }

    public static void f(StringBuffer p){
        p.concat("jkl");
    }
}

问题只是询问print语句的输出是什么。我的第一个想法只是“ghi”,但这是不正确的。如果方法f将b作为参数并将其设置为p,那么.concat()如何修改b?我已经阅读了StringBuffer文档,并且不明白为什么这不会以b等于“ghi”结束,而p是“ghijkl”。

基本上,在p上调用的.concat()方法如何修改b?

2 个答案:

答案 0 :(得分:2)

首先,您需要正确创建一个StringBuffer。

StringBuffer foo = new StringBuffer("some string");

您将对象传递给函数。 Java将对象作为引用传递(引用本身当然是按值传递的)。请参阅:Is Java "pass-by-reference" or "pass-by-value"?

由于你有一个StringBuffer的引用而不是它的副本,你实际上修改的是同一个对象,就像你在main中一样。

答案 1 :(得分:1)

这是通过引用解析和按值解析之间的区别。

例如,当您创建一个采用基元的方法时,它会经历所谓的按值解析。 JVM几乎创建了一个值的副本,这就是你在方法中得到的。

int j = 0;
foo(k);
System.out.println(j); //Will still be 0.

public static void foo(int i) {
 //i is not j (what you called the method with), it is a copy of it that is only valid within this method
 i++;
}

现在,当您使用StringBuffer之类的对象调用方法时,您正在按reference进行解析。这意味着您没有解析StringBuffer的值(不解析带有“ghi”作为其内容的StringBuffer`),而是解析指向它的指针。使用此指针,您仍然可以在其他方法和代码体中对原始对象进行操作。