目录
- ✨一、 数组基本用法
- 1.数组的作用
- 2.数组的创建
- 3. 数组的使用
- ⛲二、数组作为参数的方法
- 1.理解引用类型
- ⛹️三、数组作为方法的返回值
- ⛵四、数组练习
- ⌚五、理解深拷贝与浅拷贝
- ⚽六、二维数组
- ⌛七、不规则的二维数组
✨一、 数组基本用法
1.数组的作用
能让我们批量创建相同类型的变量
2.数组的创建
下面这三种创建方式都是可以的
3. 数组的使用
(1)获取长度
注意事项
使用
arr.length
能够获取到数组的长度. . 这个操作为成员访问操作符. 后面在面向对象中会经常用到
代码示例:
(2)访问数组中的元素
注意事项:
- 使用 [ ] 按下标取数组元素. 需要注意, 下标从 0 开始计数
- 使用 [ ] 操作既能读取数据, 也能修改数据.
- 下标访问操作
不能超出有效范围 [0, length)
, 如果超出有效范围, 会出现下标越界异常
代码示例:
(3)下标越界
数组下标从0开始,范围是 [0,arr.length) ,左闭右开的区间,或者是[ 0,arr.length-1].
如果我们将下标的值超出数组的范围…
如下所示
(4)遍历数组(三种方法)
1.遍历方式(一)----- for循环
2.遍历方式(二)----> for-each
for-each 遍历的原理
遍历array 里面的每一个元素,把每一个元素取出来,然后赋值给了 x ,最后打印 x ,直到 array 里面的元素全部都遍历完成.
两种遍历的方式我们介绍完了,那么for循环和for-each有什么区别?
for循环是可以拿到数组下标的,for-each拿不到数组下标,所以for-each只能够全部遍历,无法对数组元素进行修改或进行操作.
3.遍历方式(三)-----> 使用操作数组的工具类进行数组的打印(Arrays)
Arrays 就是操作Java数组的工具类,你要对数组做什么事情,就可以通过他来做,当然有些事情他是完成不了的.
比如说:我们要打印数组,我们本来是用for循环 或者 for-each 来写的,但是我们也可以用Arrays的工具类打印.
通过JDK的工具文档,我们查找到了相应的工具类.
代码如下:
⛲二、数组作为参数的方法
1.理解引用类型
(1)参数传内置类型
我们用 内置类型作为参数,进行交换变量,但是最后编译的结果 两个变量却并未发生交换.
这是为什么呢?
(2)参数传数组类型
结果:
我们用 数组作为参数
,进行交换变量,编译运行后,发现成功交换
两个变量的值。此时数组名 arr 是一个 “引用”
. 当传参的时候, 是按照引用传参
.
那么为什么传引用类型可以 形参可对实参进行操作呢?
这里我们就要先从内存说起
数组在内存中的储存:
我们可以知道,
数组这个在栈中存放的变量实际存放的是 堆中数据的地址
,当我们 arr 数组作为参数 传入 方法里,我们就把 堆中数据的地址 传入了进去,在方法内部,我们可以根据 这个地址 找到堆中的数据进而修改数据,从而实现了形参改变了实参的操作.
如下图:
总结:
所谓的 “引用” 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大).
(3)JVM内存区域划分
array 和 a 都是局部变量,在栈上开辟空间
那么问题来了,a的空间里存的是 10,但是数组后面的数据,放在哪里?
和 10 一样放在栈上?对象是存放在 堆上的
看一下JVM的5个部分
关于上面的划分方式, 后面慢慢理解. 此处我们重点理解 虚拟机 栈 和 堆
.
局部变量和引用保存在栈上, new 出的对象保存在堆上.
- 堆的空间非常大, 栈的空间比较小.
- 堆是整个 JVM 共享一个, 而栈每个线程具有一份(一个 Java 程序中可能存在多个栈).
(4)初始null
引用很像指针,最大的区别就是不能对 引用 解引用,可以对指针解引用,因为在Java没有传址的概念的,其他功能类似,但时两个东西,不是同一个东西,不能混淆在一起。
指针有空指针,那引用有空引用(引用里面存的地址是空的)吗?
有的,只不过跟C语言不同,C是大写NULL,Java是小写null