前言
数组本身很简单,但是通过学习数组,我们可以加深对引用的理解,这也是学习链表的基础,希望这篇文章能对你有帮助。
先搞清楚是什么的问题
认识数组
数组就是 相同数据类型元素
的一个集合
。
认识引用变量
引用变量就是存放地址的变量,这个和c语言的中指针中的定义不能说很像,只能说一模一样。
认识null
null在java中表示空引用,即不指向任何一个对象
数组的创建和初始化
public class Test1 {
public static void main(String[] args) {
int []arr1=new int[10];//动态初始化,arr1数组里面默认放了十个零
int []arr2=new int[]{1,2,3};//静态初始化,通过放的内容来判断开辟的数组的大小
int[] arr3={1,2,3,4};//甚至new int还可以省略
}
}
什么动态初始化,静态初始化这些名词,可以不用管,不用记,但是需要记住的是没有放元素的时候,默认放的是0
数组怎么和引用变量扯上关系的
数组名存放的是数组的地址,所以数组名是引用变量
局部变量(方法体中的变量) 在虚拟机栈区
(具体是什么以后再深入了解),对象一定在堆上,但是引用变量不一定在栈上
(当即使成员变量又是引用变量的时候在方法区),如果现在不知道什么是成员变量也没关系 。
记住对象一定在堆上引用变量不一定在栈上就行
三者之间的关系
引用变量(数组名)和对象(数组)之间的关系
再谈引用变量
请问以下代码输出什么?
public static void main(String[] args) {
int []arr1=new int[3];
arr1[0]=10;
arr1[1]=20;
arr1[2]=30;
int []arr2=new int[]{1,2,3,4,5};
arr2[0]=1;
arr2[1]=2;
arr1=arr2;
arr1[2]=300;
arr1[3]=400;
arr1[4]=500;
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i]+" ");
}
}
或许你会想什么都不输出,数组越界?其实正确答案是1 2 300 400 500
不知道你做对没
====================================================================
ok,现在开始揭晓谜题。
在运行arr1=arr2之前的一步,如图是这样的情况。相信大家都没问题,令人困惑的是arr1=arr2什么意思。
arr1=arr2的意思是把arr2里面存的东西给arr1
如同int a=6,b=2; a=b;一样把b里面存的二赋值给a这里是把arr2里面存的地址赋值给arr1
由于arr1存的是ox98了,所以
指向改变
了,同时因为原先的数组那个空间没有引用能找到了,所以就被回收了。也就是不存在了。再执行arr1[2]=300; arr1[3]=400;arr1[4]=500;就好理解了
数组的应用场景
作为函数的参数
请问以下代码输出什么?
public static void main(String[] args) {
int []arr= {1,2,3,4};
fun(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
public static void fun(int[]arr){
arr1[0]=99;
}
解析:
arr和arr1指向同一片空间
当arr1[0]=90的时候 把arr指向的东西也改了(
因为他们指向的是同一个东西
)
请看以下代码,请问输出什么?
public static void main(String[] args) {
int []arr= {1,2,3,4};
fun(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
public static void fun(int[]arr1){
arr1=new int[7];
}
解析:
arr里面的值传给arr1的时候他们共同指向一个空间
arr 1=new int [10];
现在arr1,和arr分别指向两个空间,arr1和arr互不影响
,所以打印出来是 1 2 3 4
作为函数的返回值
举个栗子
,请看以下代码
public static void main(String[] args) {
int []ret= fun();
for (int i = 0; i < ret.length; i++) {
System.out.print(ret[i]+" ");
}
}
public static int[] fun(){
int []arr={1,2,3,4};
return arr;
}
这个代码不难理解,但是有些小细节还是值得提一下
fun()方法运行完时如图
出了fun()方法arr这个局部变量就被销毁了,但是arr里面的值赋值给了ret,所以开辟的空间还有引用指向它,所以它没被销毁。
小结:
画图对学习编程有很大的帮助,在这里能帮助我们理解引用。在今后的学习中,尤其是数据结构,画图更能帮我们理清思路,所以请多画图,多调试,来理解代码。希望能对你有帮助,祝你学业顺利,平安健康。