一. 数组
1.数组的定义
之前我们存储数据用变量,但如果数据量过多,挨个定义变量存储数据明显无法满足我们的需求,所以我们得学习另一个存储数据的容器—数组。数组是能存储多个单一数据类型的数据,并且长度固定的容器。
那该如何定义数组呢?
通常有两种定义格式:
1. 数组类型[] 数组名
例如:int[] arr;
2. 数组类型 数组名[]
例如:int arr[];
int 为数组的类型,和变量的类型分类一致,代表这个数组里的数据全为int型。
[] 为数组的标识,在控制台输出时也通常会显示一个“[”符号来表示该值为数组。
“arr”为自定义的数组名,可任取。
2.数组的初始化
上一步,我们学习了数组java基础数组应用的定义格式,我们都知道变量在使用时都要初始化,数组也相当于一个存储了多个相同类型的数据的变量,也需要初始化才能使用。那如何初始化数组呢?
一般来说,初始化分为动态初始化和静态初始化,下面让我们来仔细看看。
2.1动态初始化
动态初始化,是指在定义数组时,我们不给数组赋具体的值,而是给数组指定长度,让系统自动给我们的数组默认一个初始值。
例如:int[] arr=new int[8];
此处我们给数组指定了一个长度为8的空间,并把数组定义为int型,所以系统会自动给这个长度为8的空间分别赋为0。
不同的数据类型,系统分配的默认值也不同:
2.2静态初始化
静态初始化就是我们自己定义数组时就把数组的具体元素赋值给数组,由系统自动给数组分配空间。
例如:int[] arr=new int[]{1,2,3,...};或:int[] arr={1,2,3,...};
此时的new int[]就不加数组长度。
3.数组的访问
定义好数组之后,我们得去访问数组的元素,对元素进行运算,那如何访问数组元素呢?此时一个重要的角色登场,即索引(也称下标)。
索引从0开始计数,例如:int arr[]=new int[]{1,2,3,4,5};
此时,arr数组的元素有5个,a[0]=1, a[1]=2, a[2]=3,“0”“1”“2”就是第0个元素、第1个元素、第2个元素的索引。
如果定义了一个没有被赋值的数组,我们也可以通过索引对数组元素进行赋值。
如下图:
4.二维数组的定义、初始化及访问
二维数组和一维数组定义方法相似,不同的是用两个中括号来表达自己的元素。
int[][] arr;
此时第一个中括号就代表能存放多少个一维数组,第二个中括号就代表每个一维数组能存放多少个元素。
4.1动态初始化
当对二维数组动态初始化时,第一个括号的元素必须要写,第二个括号的元素可以不写。例如:
int[][] arr = new int[3][];
此时,arr数组中的三代表这个数组能存放三个数组的地址。
int[][] arr = new int[3][2];
此时,arr数组里可以存放三个一维数组,而每个一维数组都能存放两个元素。
4.2静态初始化
同一维数组的静态初始化类似,只不过将一维数组的元素换成个一维数组,二维数组的静态初始化如下:
int arr[][]=new int[][]{{1,2,3},{4,5,3},{5,5,5},{6,5,7}};
或:
int arr[][]={{1,3},{4,5,3},{4,5,5,5},{6,5,7}};
5.数组的遍历
由于我们常常需要对数组的元素进行处理(排序、比较大小、交换元素等),所以常常需要对数组元素进行遍历,通常由循环来完成遍历,由于数组长度是定义之后就不再改变的,所以长度已知,循环次数已知,故而通常由for循环来进行遍历。
5.1查找最大值
例如:
查找数组元素的最大值,我们可以通过循环索引,遍历元素来实现。
5.2排序
排序也需要依次遍历元素,然后让相邻两个元素交换,达到越来越大或越来越小的元素排序。但很多时候一次遍历不能符合要求,所以需要遍历多次,所以需要双层循环结构,外层循环用于控制排序次数,内层循环用于控制单次排序交换的元素个数。
6.常见的数组问题
6.1索引越界
当我们查找的索引超过数组本身的长度,也就是访问了超过数组长度的变量时,会出现索引越界的现象,此时需要重新检查索引,更正属于正确范围的索引。
例如,数组只有4个元素: int arr[]={1,2,3,4},此时arr的索引最大值为3,即arr[3]元素,此时输入一个arr[4]无法让系统查找到第5个元素,即为索引越界。
6.2空指针异常
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/1448.html