1.基本类型:基本类型作为参数传递时,是对传递值的拷贝,无论怎么改变这个拷贝,原值是不会发生变化的。
public class Test {
public static void main(String[] args) {
int i = 3;
System.out.println("before: " + i);
change(i);
System.out.println("after: " + i);
}
public static void change(int v) {
v++;
}
}
2.引用类型:
先看一下引用类型在内存的储存结构:String str = "hello";
在引用类型作为参数传递时,是把对象在内存中的引用地址拷贝了一份传给参数,而不是把对象拷贝。一旦引用地址发生改变时,操作的就不是原来的对象。
String
package cn.jxufe.test;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
String str = "hello ";
System.out.println("str的值:" + str);
System.out.println("str的hash值:" + str.hashCode());
change(str);
System.out.println("传参改变后str的值:" + str);
}
public static void change(String str) {
System.out.println("传参得到的str的hash值:" + str.hashCode());
str += "world";
System.out.println("传参改变后str的hash值:" + str.hashCode());
}
}
String 类是比较特殊的,其内部是 final char[],所以当 str += "world";时相当于新创建了一个对象 str1 = "hello world",然后再将 str1 的引用地址赋值给 str;所以传参之后改变了 str 的值,与之前传入的引用地址是两个地址。
StringBuffer
package cn.jxufe.test;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
StringBuffer strbuf = new StringBuffer("hello ");
System.out.println("传参之前的strbuf值:" + strbuf);
System.out.println("传参之前的hash值:" + strbuf.hashCode());
change(strbuf);
System.out.println("传参之后的strbuf值:" + strbuf);
System.out.println("传参之后的hash值:" + strbuf.hashCode());
}
public static void change(StringBuffer strbuf) {
strbuf.append("world");
}
}
StringBuffer 是可变的字符串,传入的是 strbuf 的引用地址,引用地址可以操控其对象的内容,因此将 strbuf 传参改变之后引用地址并不会改变。
package cn.jxufe.test;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
StringBuffer strbuf = new StringBuffer("hello ");
System.out.println("传参之前的strbuf值:" + strbuf);
System.out.println("传参之前的hash值:" + strbuf.hashCode());
change(strbuf);
System.out.println("传参之后的strbuf值:" + strbuf);
System.out.println("传参之后的hash值:" + strbuf.hashCode());
}
public static void change(StringBuffer strbuf) {
strbuf = new StringBuffer("Hi ");
strbuf.append("world");
}
}
当传参后 strbuf 被赋值了新的对象地址时,传参之前的 strbuf 就不会发生改变。