首先祝大家节日快乐!
String,传值之类的问题总是经久不衰的,无聊,画了几张图(基本示意,不考虑具体实现,字节对齐等)
变量就是内存区,==比较的是变量的内容。
int a = 5;
int b = a;
Object c = new Object();
Object d = c;
a和b是基本类型,所以直接保存值。c和d保存引用。引用到底是什么,依赖于具体虚拟机的实现,目前大部分虚拟机选择的是直接使用指针,即地址。
上面语句之后,你让a = 8,自然不会影响b,因为b存的是值,a是什么它不知道。让c再赋值一个新对象,自然也不会影响到d,同理。所以,基本类型和引用类型从这里看没有什么区别。
使用==判断时,只要看一下内存里的数据是不是一样就可以了,可以认为是简单的值比较。
关于传参,权威书籍会告诉我们,java里只有pass by value。
void test(int a,String str,StringBuilder builder){
a = 8;
str = "abc";
builder.append("modify");
builder = new StringBuilder("test");
}
调用
int a_src = 1;
String str_src = "source";
StringBuilder builder_src = new StringBuilder("source");
test(1,str_src,builder_src);
调用前内存:
调用时,先复制参数。所有参数copy一份:
执行
a = 8;
str = "abc";
builder.append("modify");
之后:
a = 8; str = "abc";自然不会影响a_src和str_src了。【注意这里和String是否是可变类没有半毛钱关系】
builder.append("modify");这个因为改变了builder内容(此时和builder_src一样)所引用的对象,再通过builder_src看对象时,自然会发现变化。
执行builder = new StringBuilder("test");之后:
改变了builder这个变量的内容,关builder_src何事?