java的值传递和引用传递
首先,由于java没有指针机制,所有java归根究底只有值传递,没有引用传递。
java中所谓对象(数组,类,接口)的引用传递,实际上是对于该对象的地址的值传递.
那么这里可以对String和StringBuffer的传递方式做一个推论:
String和StringBuffer都是引用类型
作为参数传入的时候是传递的其地址,但是如果出现赋值操作,比如String = “x”,String = new String(“xx”)
意味着开辟新的内存空间并赋值给String,此时原来的内容的地址已被丢弃,故看上去变成修改了String的内容,但方法外面的内容却不变
Stringbuffer的append方法本质上没有开辟新的内存空间,只是在原有空间上拓展,那么看上去就是修改内容,方法外面的内容也跟着修改了,但是实际上,你对Stringbuffer进行new的赋值的话,那么它和String就一样了。
2018.03.20新增
String的特殊性在这里补充一下。
String特殊在jvm对String有专门的处理方式,如果你使用String s = new String(“xx”),那么你调用的是String类的构造方法,获得的是一个对象(存放在堆中),如果你使用String s = "xx",jvm会检查内存的常量区有没有“xx”,有则s的值实际上是“xx”的地址,如果没有,就在常量区创建一个字符串“xx”,把该字符串的地址赋值给s。
给个解释这个情况的链接:java-字符串的创建和存储机制
至于String为什么会出现这么麻烦的情况,下回补充。