接上节 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() 是方法。例如Stringstr.length();数组arr.length;二者不要混淆。八、数组的遍历数组遍历是数组使用中最常见的操作。所谓遍历按照一定顺序访问数组中的每一个元素。例如数组int[]nums{10,20,30};遍历结果102030Java 中数组遍历主要有两种方式普通 for 循环增强 for 循环foreach。8.1 使用普通 for 循环遍历语法for(初始化;条件判断;更新){}数组遍历int[]nums{10,20,30,40};for(inti0;inums.length;i){System.out.println(nums[i]);}执行过程第一次i0nums[0]10第二次i1nums[1]20依次访问10203040为什么使用 length推荐inums.length不要写i4原因如果数组长度改变int[]numsnewint[100];代码仍然可以正常运行。8.2 增强 for 循环foreachJava 提供了一种更加简洁的数组遍历方式。语法for(数据类型 变量:数组){}例如int[]nums{10,20,30,40};for(intnum:nums){System.out.println(num);}输出10203040执行过程第一次num10第二次num20第三次num30第四次num408.3 普通 for 和 foreach 对比比较普通for增强for是否需要索引需要不需要能否修改元素可以不推荐能否倒序遍历可以不可以代码复杂度稍高简单什么情况下使用普通 for例如需要修改数组元素for(inti0;iarr.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[]numsnull;System.out.println(nums.length);运行报错NullPointerException为什么因为nums没有指向任何数组对象。访问nums.length相当于访问一个不存在的对象。因此报错。解决创建数组int[]numsnewint[5];或者赋值int[]nums{1,2,3};十、数组练习10.1 数组求和需求计算数组所有元素之和。代码publicstaticintsum(int[]arr){intsum0;for(inti0;iarr.length;i){sumarr[i];}returnsum;}测试int[]nums{10,20,30};System.out.println(sum(nums));结果6010.2 求数组最大值思路假设第一个元素最大然后依次比较。代码publicstaticintmax(int[]arr){intmaxarr[0];for(inti1;iarr.length;i){if(arr[i]max){maxarr[i];}}returnmax;}执行int[]nums{10,50,20,30};结果5010.3 数组元素查找顺序查找需求查找数组中是否存在某个元素。例如查找 30代码publicstaticintsearch(int[]arr,inttarget){for(inti0;iarr.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(inti0;iarr.length/2;i){inttemparr[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);结果类似[I1b6d3586这是数组对象地址信息。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注意不要使用ab因为比较的是地址。11.4 Arrays.copyOf()作用数组复制。例如int[]nums{1,2,3};int[]copyArrays.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[][]arrnewint[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 个元素。结果6012.3 二维数组遍历二维数组遍历需要两层循环。原因外层循环控制行。内层循环控制列。普通 for 循环遍历例如publicclassDemo{publicstaticvoidmain(String[]args){int[][]arr{{10,20,30},{40,50,60},{70,80,90}};for(inti0;iarr.length;i){for(intj0;jarr[i].length;j){System.out.print(arr[i][j] );}System.out.println();}}}输出102030405060708090执行过程第一次外层循环i0访问102030第二次i1访问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[][]arrnewint[2][3];很多人认为二维数组是一整块连续空间。实际上二维数组本质是数组里面存放多个一维数组的引用。创建过程第一步创建外层数组arr它保存两个元素。第二步创建两个一维数组。内存如下图因此二维数组实际上包含一个外层数组多个内层数组。