从引用的角度看待java函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_36570478/article/details/81353816
public class QuoteTest {
    private static String quote1 = "test";
    private static String quote2 = "test";
    private static String newString = new String("test");

    static void operate(StringBuffer x, StringBuffer y) {
        x.append(y);
        y = x;
    }
    public static void main(String[] args) {
        System.out.println(quote1 == quote2);
        System.out.println(quote1 == newString);
        System.out.println(quote1 == newString.intern());

        StringBuffer a = new StringBuffer("A");
        StringBuffer b = new StringBuffer("B");

        operate(a, b);

        System.out.println(a + "." + b);
    }
}


//:output~
true
false
true
AB.B

分析quote1==quote2:

在初始化String常量时,先去string pool寻找是否"test"字符串,如果存在则直接指向"test"所在地址,否则在string pool中创建"test"字符串。所以,quote1初始化过程中string pool中创建了一份"test",而quote2在初始化时,由于"test"已经存在,所以直接指向quote1创建的"test"。

分析quote1 != newString:

newString,通过new创建,在创建时检测到string pool中已存在“test”字符串,故在堆中申请一块内存,内存内容为quote1指向的"test"地址,quote1 == newString.intern(),可以证明这一点。

分析operate()函数运行结果:

x 指向a指向的地址,y指向b指向的地址,x.append(y)是对a指向的对象直接进行操作,将改变a指向的地址的内容。y=x,将y指向的地址赋值为a所在的地址,不对b所指向的内容造成影响。

猜你喜欢

转载自blog.csdn.net/weixin_36570478/article/details/81353816