基石
//了解引用数据类型可跳
Java数据类型分两种,基本数据类型和引用数据类型,数组属于引用数据类型。
基本数据类型所存的是所定义变量的数值。
引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。
import java.util.Arrays;
public class Study {
public static void main(String[] args){
int []a=new int[]{1,2,3};
int []b=new int[]{1,2,3};
System.out.println(Arrays.toString(a));//输出数组a
System.out.println(Arrays.toString(b));//输出数组b
System.out.println(a);//变量a所存的地址
System.out.println(b);//变量b所存的地址
System.out.println(Arrays.equals(a,b));//判断数组a与数组b的内容是否相同//true
System.out.println(a==b);//判断a与b的地址是否相等//false
}
}
[1, 2, 3]
[1, 2, 3]
[I@28d93b30
[I@1b6d3586
true
false
需要注意的是,哪怕开始时给数组的内容是一样的,地址也会不同,但是你令a=b后,两个地址就会相同,指向同一个空间。
import java.util.Arrays;
public class Study {
public static void main(String[] args) {
int[] a = new int[]{1, 2, 3};
int[] b = new int[]{1, 2, 3};
System.out.println(a);
System.out.println(b);
a=b;
System.out.println("-----------");
System.out.println(a);
System.out.println(b);
}
}
[I@28d93b30
[I@1b6d3586
-----------
[I@1b6d3586
[I@1b6d3586
原理
Java的形参传递针对它的两种数据类型也有不同的传递方式。
如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值,称为值传递。
如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值,称为引用传递。
当然,传递的不是实参本身,相当于做了一个复印件给了形参,因此,一般情况下,对形参的改动不影响实参,但是引用数据类型是特殊的,做一个比喻就是,像是一张便利贴,标明为一号便利贴,值传递是又写了一个便利贴为二号,内容和一号一样,但在上面改动不会影响一号;引用传递则是三号便利贴,写了一号便利贴藏的地点,可以以此找到一号进行更改。
以上的比喻,可以恰恰好的解释另一个容易忽视的问题------我不改内容,我改地址会不会也可以。(相当于我不去找地点,我就在三号便利贴上改改地址)
很遗憾,不可以。方法可以通过拷贝的地址更改地址指向的内容,但不允许更改地址。
以下代码和段落来自更改示例(GatasMa前辈的文章)
原文链接:https://blog.youkuaiyun.com/qq_40456064/article/details/94594037
import java.util.*;
import static java.lang.StrictMath.floorMod;
public class Test {
public static void main(String[] args) {
int [] array = {1};
reOrderArray(array);
System.out.println(Arrays.toString(array));
}
public static void reOrderArray(int [] array){
int [] tempArray = {0};
// 1. --------------
// for(int i = 0;i < array.length;i++) {
// array[i] = tempArray[i];
// }
// 2. --------------
// array = tempArray;
// 3. --------------
// array = Arrays.copyOf(tempArray, tempArray.length);
}
}
————————————————
定义了一个无返回值的方法,传入一个array数组,在方法中对数组进行修改,采用1、2、3的方法对array数组进行修改,方法结束后得到的数组是不一样的,大家可以试一下,2、3方法对main方法里的array不能产生任何影响,只有采用1后,array数组中的值才会变化,这个点很大可能在代码中产生不必要的麻烦,所以,我建议除非自己知道,在方法里做数组拷贝时,建议循环拷贝
————————————————