1.数组的创建规范
如图数组大约有以上创建方法,arr3是错误示范,即如果[]内定义了长度就不要自己初始化,想自己初始化就不要在[]内定义长度
2.数组是引用类型
什么是引用类型?你可以理解为这个变量中存储的是地址,还不明白没关系,继续看
2.1JVM对内存的划分
看Java虚拟机运行时的数据图
今天我们主要讨论虚拟机栈和堆
1.首先我们要知道,局部变量是存储在栈里面的
2.而堆一般用来存储对象
2.2基本数据类型和引用数据类型的区别
1.基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
2.而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址
2.3下面十分十分非常关键!!!
如图jvm在栈上创建了数组arr,在堆上创建了对象1,2,3,4而栈上的arr又存放了能找到堆上对象的“地址”
所以就形成了arr这个引用 指向了 数组对象
引用指向对象
java还有个非常方便的地方就是,当main方法执行完,在栈上为arr开辟的空间被自动回收,堆上的对象就没有人再指向他了,于是也被自动回收,就没了
下面我们来看一个例子
这会发生什么呢
如图arr把他对象的地址给了arr2使得arr2也指向了那个对象就形成了两个引用来指向一个对象的局面(所以别泄露对象信息,不然会被其他人盯上)
因为他们指向了同一块空间,所以通过一个引用修改,另一个也会变化
如
下面我们再来看一个例子巩固
结果
为什么会出现这样的结果,大佬们可以根据之前的知识自己做做
提一下,当func方法执行完毕,因为array1和array2是局部变量,会被回收
3.认识null(空)
int [] arr = null;
代表这个引用不指向任何的对象
如果他是空的我们还非要去用就会报异常
4.数组的应用场景
4.1作为函数的参数
例子
为什么会出现这种情况呢?
经过func为什么没有改变呢,因为形参arr进行new int[10] 操作后,只是把里面存的实参arr的地址,改成了新创建对象的地址,所以并没有对实参进行改变
如
5.数组练习
1.借助工具类将数组转化为字符串
2.借助工具类copy
copy长度*2相当于copy加扩容
copy局部
用强大的arraycopy把arr复制到copy
完毕