C语言中可以使用指针*或引用&把一企业基本数据类型传到一个函数里面,然后改变它的值,Java没有这个功能。
Java中所有的赋值操作=和函数传参,传递的都是“值”,但是要特别强调一下,对于引用数据类型(除基本数据类型以外的所有java数据类型,String也属于引用数据类型)的变量,变量本身的值是指向那片内存的地址。
StringBuffer a=new StringBuffer("123");
StringBuffer b=a; //b也指向了a所指的内存
b.append("456"); //通过b修改了内存的内容
System.out.println(a); //通过a访问内存中的内容
输出:123456
StringBuffer a=new StringBuffer("123");
StringBuffer b=new StringBuffer(a); //开辟了新的内存空间,然后发生了复制
b.append("456"); //不影响a所指的内存空间
System.out.println(a);
输出:123
String a="123"; //开辟了内存空间,里面存放“123”,a指向了这片内存
String b=a; //b也指向了a所指的内存空间
b="456"; //开辟了新的内存空间,里面存放“456”,b指向了这片新的内存
System.out.println(a);
String[] arr=new String[3];
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
System.out.println();
for(int i=0;i<arr.length;i++){
arr[i]+="w";
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
System.out.println();
for(String ele: arr){
ele+="D";
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
System.out.println();
输出:
null null
null
nullw nullw
nullw
nullw nullw
nullw
String数组创建之后,默认将每个元素初始化为null。注意null并不是什么都没有,null本身也是一个数值,也要占存储空间。
通过for(int i=0;i<arr.length;i++)这种方式遍历数组或集合时,取得的是每个元素“本来的内容”,所以这种方式可以修改数组的内容。
通过for(T ele:collection)这种方式遍历数组或集合时,取得的是每个元素的“副本”,所以这种方式不能改变数组原来的内容。
把引用类型当参数传递时传递的是地址。
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer("good"); //内存块1里存放的内容是"good",现在s1指向该内存块
StringBuffer s2 = new StringBuffer("bad"); //内存块2里存放的内容是"bad",现在s2指向该内存块
test(s1, s2);
System.out.println(s1); //输出内存块1的内容
System.out.println(s2); //输出内存块2的内容
}
static void test(StringBuffer s3, StringBuffer s4) { //传参时按值发生了复制,即s3指向内存块1,s4指向内存块2
s4 = s3; //s4指向了内存块1
s3 = new StringBuffer("new"); //开辟了新的内存块3,内存块3里存放的内容是"new",现在s3指向该内存块
System.out.println(s3); //输出内存块3的内容
System.out.println(s4); //输出内存块1的内容
s3.append("hah"); //内存块3的内容变成了"newdhah"
s4.append("hah"); //内存块1的内容变成了"gooddhah"
}
输出:
new
good
goodhah
bad