JavaSE 基础语法 - 数组的定义与使用 - ②
接上节 JavaSE 基础语法 - 数组的定义与使用 - ① 的内容。
七、数组元素的访问
一个数组包含:
- 数组变量;
- 数组对象;
- 数组元素;
- 数组索引。
其中,数组元素通过索引进行访问。
7.1 通过索引访问数组元素
数组访问格式:
数组名[索引]例如:
int[]nums={10,20,30,40};System.out.println(nums[0]);输出:
10这里nums[0]表示访问数组中索引为 0 的元素。
数组对应关系:
索引:0123↓ ↓ ↓ ↓10203040因此:
nums[0]->20nums[2]->30注意:
- 数组索引从 0 开始。
- 如果想要访问最后一个元素,可以使用 数组长度 - 1。
7.2 修改数组元素
数组元素不仅可以读取,也可以修改。
例如:
int[]nums={10,20,30};nums[1]=200;System.out.println(nums[1]);输出:
200执行过程:
修改前:
┌─────────────┐ │10│20│30│ └─────────────┘执行:
nums[1]=200;修改后:
┌───────────────┐ │10│200│30│ └───────────────┘注意:修改的是数组对象中的元素。
数组长度不会发生变化。
7.3 获取数组长度
Java 数组提供了:length属性。
用于获取数组中元素的个数。
例如:
int[]nums={10,20,30,40};System.out.println(nums.length);输出:
4注意:
数组长度:
nums.length不是:
nums.length()因为:
- length 是数组属性;
- length() 是方法。
例如:
String:
str.length();数组:
arr.length;二者不要混淆。
八、数组的遍历
数组遍历是数组使用中最常见的操作。
所谓遍历:按照一定顺序访问数组中的每一个元素。
例如:
数组:
int[]nums={10,20,30};遍历结果:
102030Java 中数组遍历主要有两种方式:
- 普通 for 循环;
- 增强 for 循环(foreach)。
8.1 使用普通 for 循环遍历
语法:
for(初始化;条件判断;更新){}数组遍历:
int[]nums={10,20,30,40};for(inti=0;i<nums.length;i++){System.out.println(nums[i]);}执行过程:
第一次:
i=0nums[0]10第二次:
i=1nums[1]20依次访问:
10203040为什么使用 length?
推荐:
i<nums.length不要写:
i<4原因:
如果数组长度改变:
int[]nums=newint[100];代码仍然可以正常运行。
8.2 增强 for 循环(foreach)
Java 提供了一种更加简洁的数组遍历方式。
语法:
for(数据类型 变量:数组){}例如:
int[]nums={10,20,30,40};for(intnum:nums){System.out.println(num);}输出:
10203040执行过程:
第一次:num=10第二次:num=20第三次:num=30第四次:num=408.3 普通 for 和 foreach 对比
| 比较 | 普通for | 增强for |
|---|---|---|
| 是否需要索引 | 需要 | 不需要 |
| 能否修改元素 | 可以 | 不推荐 |
| 能否倒序遍历 | 可以 | 不可以 |
| 代码复杂度 | 稍高 | 简单 |
什么情况下使用普通 for?
例如:
需要修改数组元素:
for(inti=0;i<arr.length;i++){arr[i]+=10;}需要通过索引访问:arr[i]
什么情况下使用 foreach?
只是读取数组:
for(intnum:arr){System.out.println(num);}推荐使用 foreach。
九、数组常见异常
在平常写代码的时候经常会出现异常。
其中最常见的有两个:
- 数组越界异常;
- 空指针异常。
9.1 ArrayIndexOutOfBoundsException
中文:数组索引越界异常。
原因:访问了不存在的索引。
例如:
int[]nums={10,20,30};System.out.println(nums[3]);数组长度:
3合法索引:
012但是访问nums[3]不存在。
因此报错:ArrayIndexOutOfBoundsException
解决:
访问数组时不要超过数组长度。
尽量使用:
length-1来确定长度。
9.2 NullPointerException
中文:空指针异常。
例如:
int[]nums=null;System.out.println(nums.length);运行报错:NullPointerException
为什么?
因为:nums没有指向任何数组对象。
访问nums.length相当于访问一个不存在的对象。
因此报错。
解决:
创建数组:
int[]nums=newint[5];或者赋值:
int[]nums={1,2,3};十、数组练习
10.1 数组求和
需求:计算数组所有元素之和。
代码:
publicstaticintsum(int[]arr){intsum=0;for(inti=0;i<arr.length;i++){sum+=arr[i];}returnsum;}测试:
int[]nums={10,20,30};System.out.println(sum(nums));结果:
6010.2 求数组最大值
思路:假设第一个元素最大,然后依次比较。
代码:
publicstaticintmax(int[]arr){intmax=arr[0];for(inti=1;i<arr.length;i++){if(arr[i]>max){max=arr[i];}}returnmax;}执行:
int[]nums={10,50,20,30};结果:
5010.3 数组元素查找(顺序查找)
需求:查找数组中是否存在某个元素。
例如:查找 30
代码:
publicstaticintsearch(int[]arr,inttarget){for(inti=0;i<arr.length;i++){if(arr[i]==target){returni;}}return-1;}返回:
- 找到:返回索引;
- 没找到:返回 -1。
10.4 数组逆序
例如:
原数组:1 2 3 4 5
变成: 5 4 3 2 1
代码:
publicstaticvoidreverse(int[]arr){for(inti=0;i<arr.length/2;i++){inttemp=arr[i];arr[i]=arr[arr.length-1-i];arr[arr.length-1-i]=temp;}}十一、Arrays 工具类
Java 提供了一个专门操作数组的工具类:java.util.Arrays它提供了大量数组操作方法。
使用前需要导入:import java.util.Arrays;
下面仅介绍几个常用的。
11.1 Arrays.toString()
作用:将数组转换成字符串。
例如:
int[]nums={10,20,30};System.out.println(Arrays.toString(nums));输出:
[10,20,30]否则
直接输出数组:
System.out.println(nums);结果类似:
[I@1b6d3586这是数组对象地址信息。
11.2 Arrays.sort()
作用:数组排序。
例如:
int[]nums={30,10,20};Arrays.sort(nums);System.out.println(Arrays.toString(nums));结果:
[10,20,30]默认:升序排序。
11.3 Arrays.equals()
作用:比较两个数组内容是否相同。
例如:
int[]a={1,2,3};int[]b={1,2,3};System.out.println(Arrays.equals(a,b));结果:
true注意:
不要使用:
a==b因为:比较的是地址。
11.4 Arrays.copyOf()
作用:数组复制。
例如:
int[]nums={1,2,3};int[]copy=Arrays.copyOf(nums,5);结果:
[1,2,3,0,0]可以用于数组扩容。
十二、二维数组
12.1 什么是二维数组
二维数组本质上是:数组中的元素仍然是数组。
也就是说:
二维数组就是:一个数组里面存放多个一维数组。
例如:
int[][]arr;可以理解为:
二维数组 一维数组 ↓[102030]一维数组 ↓[405060]一维数组 ↓[708090]因此二维数组可以表示:
- 表格;
- 矩阵;
- 多组数据。
二维数组的应用场景:
场景一:保存学生成绩
例如:
三个学生:
每个学生三门成绩:
语文 数学 英语 张三908588李四959290王五807885可以表示为:
int[][]scores={{90,85,88},{95,92,90},{80,78,85}};场景二:棋盘
例如:
五子棋棋盘:
000000102000100可以使用二维数组保存。
12.2 二维数组定义
动态初始化
语法:
数据类型[][]数组名=new数据类型[行数][列数];例如:
int[][]arr=newint[3][4];表示创建:
- 3 行;
- 每行 4 个元素。
结构:
列0123行00000行10000行20000默认值:
因为是 int 类型,所有元素默认:0
静态初始化
语法:
数据类型[][]数组名={{元素1,元素2},{元素1,元素2}};例如:
int[][]arr={{1,2,3},{4,5,6},{7,8,9}};表示:
123456789二维数组元素访问
二维数组访问:
数组名[行索引][列索引]例如:
int[][]arr={{10,20,30},{40,50,60}};System.out.println(arr[0][1]);执行:
先找:
第 0 行:10 20 30
再找:
第 1 列:20
输出:20
二维数组索引:
列012行0102030行1405060访问:arr[1][2]
表示:第 2 行,第 3 个元素。
结果:60
12.3 二维数组遍历
二维数组遍历需要两层循环。
原因:外层循环控制行。内层循环控制列。
普通 for 循环遍历
例如:
publicclassDemo{publicstaticvoidmain(String[]args){int[][]arr={{10,20,30},{40,50,60},{70,80,90}};for(inti=0;i<arr.length;i++){for(intj=0;j<arr[i].length;j++){System.out.print(arr[i][j]+" ");}System.out.println();}}}输出:
102030405060708090执行过程:
第一次外层循环:i=0,访问:102030第二次:i=1,访问:405060foreach 遍历二维数组
二维数组本质:数组里面套数组。
所以可以使用嵌套 foreach。
例如:
int[][]arr={{1,2,3},{4,5,6}};for(int[]row:arr){for(intnum:row){System.out.print(num+" ");}System.out.println();}输出:
12345612.4 二维数组内存分析
例如:
int[][]arr=newint[2][3];很多人认为:二维数组是一整块连续空间。
实际上二维数组本质是:数组里面存放多个一维数组的引用。
创建过程:
第一步:创建外层数组arr,它保存两个元素。
第二步:创建两个一维数组。
内存如下图:
因此:
二维数组实际上包含:
- 一个外层数组;
- 多个内层数组。
