JAVA第五章-数组
1.数组概述
在Java中,数组是一种数据结构,可以存储固定数量的相同类型的元素。数组是一种简单的数据结构,可以用来表示列表、矩阵和其他形式的数据结构。
Java中的数组有以下特点:
数组是一个容器,它可以存储相同类型的元素。例如,一个int数组可以存储多个整数。
数组的大小是固定的,一旦创建就无法更改。在Java中,可以使用new运算符来创建数组,并指定数组的大小。
数组中的元素可以通过索引访问,索引从0开始。例如,arr[0]表示数组中的第一个元素,arr[1]表示数组中的第二个元素,以此类推。
数组中的元素可以是任何基本数据类型或引用类型。例如,可以创建一个int数组、一个String数组或一个自定义对象的数组。
数组是一个非常常见的数据结构。它们通常用于存储和处理大量的数据,例如图像、音频和视频等多媒体数据。数组还可以用于排序、搜索、过滤和其他算法。
Java提供了许多内置的数组操作方法和语法结构,使得创建和操作数组非常方便。例如,可以使用for循环来遍历数组,使用Arrays类来对数组进行排序和搜索,使用多维数组来处理更复杂的数据结构等等。
2.一维数组
在Java中,一维数组是最简单的数组类型,它是一个存储相同类型元素的固定长度容器。一维数组在Java中的声明方式如下:
dataType[] arrayName = new dataType[arraySize];
其中,dataType表示数组中元素的类型,arrayName是数组的名称,arraySize是数组的大小。例如,以下代码声明了一个整数类型的数组arr,它可以存储5个整数:
int[] arr = new int[5];
可以使用数组下标来访问数组中的元素。在Java中,数组下标从0开始,到arraySize-1结束。例如,以下代码给数组arr的第一个元素赋值为10,第二个元素赋值为20:
arr[0] = 10;
arr[1] = 20;
也可以使用for循环遍历数组中的元素,如下所示:
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
在上面的代码中,arr.length表示数组的长度,即数组中元素的个数。循环变量i从0开始,一直遍历到arr.length-1结束,每次循环中访问数组arr的第i个元素并输出。
Java中还提供了许多内置的数组操作方法和语法结构,如Arrays类、foreach循环等,使得创建和操作数组更加方便。
2.1一维数组初始化
2.1.1 直接初始化
在声明数组时直接初始化数组,如下所示:
int[] arr = {1, 2, 3, 4, 5};
这种方式可以省略new运算符和数组的大小,Java会根据初始化的值自动推断数组的大小。
2.1.2 动态初始化
使用new运算符动态地初始化数组,如下所示:
int[] arr = new int[5];
2.1.3 静态初始化
使用静态代码块来初始化数组,如下所示:
javaCopy codestatic int[] arr;
static {
arr = new int[]{1, 2, 3, 4, 5};
}
在上面的代码中,使用静态代码块初始化数组arr。静态代码块在类加载时执行,并且只执行一次。因此,这种方式可以在初始化数组时进行一些复杂的操作。
2.1.4 循环遍历
可以通过循环遍历数组中的元素,并对它们进行一些操作,如下所示:
javaCopy codefor (int i = 0; i < arr.length; i++) {
arr[i] = i + 1;
}
在上面的代码中,循环变量i从0开始,一直遍历到数组的最后一个元素。在每次循环中,使用arr[i]访问数组中的当前元素,并将其赋值为i+1。
2.2一维数组的使用
例题:使用一维数组输出1~12月每个月份的天数。
3.二维数组
在Java中,二维数组是由多个一维数组组成的数组。它是一个表格或矩阵,每个单元格可以存储相同类型的元素。二维数组在Java中的声明方式如下:
javaCopy code
dataType[][] arrayName = new dataType[rowSize][colSize];
其中,dataType表示数组中元素的类型,arrayName是数组的名称,rowSize和colSize分别表示数组的行数和列数。例如,以下代码声明了一个整数类型的二维数组arr,它有3行4列:
javaCopy code
int[][] arr = new int[3][4];
使用数组下标来访问二维数组中的元素。二维数组中的元素可以使用arr[rowIndex][colIndex]来访问,其中rowIndex表示行下标,colIndex表示列下标。例如,以下代码给二维数组arr的第一个元素赋值为10,第二个元素赋值为20:
javaCopy codearr[0][0] = 10;
arr[0][1] = 20;
使用双重for循环遍历二维数组中的元素,如下所示:
javaCopy codefor (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
在上面的代码中,外层循环变量i从0开始,一直遍历到arr.length-1结束,内层循环变量j从0开始,一直遍历到arr[i].length-1结束。在每次循环中,使用arr[i][j]访问二维数组中的当前元素并输出。
3.1二维数组初始化
与一维数组相同二维数组也可以使用相似的方式来初始化:
3.1.1 直接初始化
在声明数组时直接初始化数组,如下所示:
javaCopy code
int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
这种方式可以省略new运算符和数组的大小,Java会根据初始化的值自动推断数组的大小。
3.1.2 动态初始化
使用new运算符动态地初始化数组,如下所示:
javaCopy code
int[][] arr = new int[3][3];
在上面的代码中,使用new运算符创建一个3x3大小的整数类型二维数组,并将数组的引用赋值给变量arr。可以使用循环或其他方式给数组的元素赋值。
3.1.3 静态初始化
使用静态代码块来初始化数组,如下所示:
javaCopy codestatic int[][] arr;
static {
arr = new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
}
在上面的代码中,使用静态代码块初始化数组arr。静态代码块在类加载时执行,并且只执行一次。因此,这种方式可以在初始化数组时进行一些复杂的操作。
3.1.4 循环遍历
通过双重循环遍历二维数组中的元素,并对它们进行一些操作,如下所示:
javaCopy codefor (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = i * j;
}
}
在上面的代码中,循环变量i从0开始,一直遍历到数组的最后一行。在每行循环中,循环变量j从0开始,一直遍历到当前行的最后一列。在每次循环中,使用arr[i][j]访问二维数组中的当前元素,并将其赋值为i*j。
3.2 二维数组的使用
例题:输出一个3行4列且所有元素都为0的矩阵
4.数组的基本操作
4.1 遍历数组
遍历数组是指按照一定顺序依次访问数组中的每一个元素。遍历数组通常使用for循环语句来实现。遍历二维数组需使用双层for循环,通过length属性可获得数组长度。
例题:呈梯形输出二维数组的元素
4.2填充替换数组元素
数组元素的填充和替换是指将数组中的元素用指定的值进行填充或替换。填充操作是将数组中的所有元素都用指定的值进行填充,而替换操作是将数组中的指定元素用指定的值进行替换。这些操作可以通过Java提供的一些工具类和方法来实现,如Arrays.fill() System.arraycopy()方法实现。
1.fill(int[] a,int value)
该方法可将指定的int值分配给int数组的每个元素。语法如下:
fill(int[] a,int value)
例题 使用fill()方法填充数组元素
2.fill(int[] a,int fromlndex,int tolndex,int value)
该方法将指定的int值分配给int型数组指定范围中的每个元素。填充的范围从索引fromlndex(包括)一直到tolndex(不包括)。如果fromlndex==tolndex,则填充范围为空。语法如下:
fill(int[] a,int fromlndex,int tolndex,int value)
fromlndex为第一个元素的索引,tolndex为第二个元素的索引。
4.3 对数组进行排序
通过Arrays类的静态方法 sort()可以实现对数组的排序。sort()方法提供了多种重载形式,可对任意类型的数组进行升序排序。语法如下:
Arrays.sort(object)
其中,object是指进行排序的数组名称
例题:使用sort()方法将数组排序后输出
4.4 复制数组
复制数组指的是将一个数组中的元素复制到另一个数组中,使得两个数组中的元素相同。Arrays类的copyOf()方法与copyOfRange()方法可以实现对数组的复制。
1.copyOf()方法
该方法提供了多种重载形式,用于满足不同类型数组的复制。语法如下:
copyOf(arr,int newlength)
例题:复制数组
2. copyOfRange() 方法
该方法能锁定数组里的一段复制。语法如下:
copyOfRange(arr,int formlndex,int tolndex)
例题:按照索引复制数组
4.5 查询数组
Java提供了Arrays类,该类提供了一些方法来操作数组,包括搜索、排序、比较、填充等操作。其中,比较常用的方法有:binarySearch()、sort()、copyOf()、equals()等。
Java中的binarySearch()方法有两种参数类型。
1.binarySearch(Object[] arr, Object key)
语法如下:
binarySearch(Object[] arr, Object key)
arr表示要搜索的数组,key为要搜索的值。
如果有key的值则返回值,如果没有则返回-1或 “-” 。
例题:查找元素在数组的索引位置
2.binarySearch(Object[] arr, int fromIndex, int toIndex, Object key)
该方法在指定的范围内检索数组,语法如下:
binarySearch(Object[] arr, int fromIndex, int toIndex, Object key)
使用该方法时要对数组进行排序,不然无法获得精准值。
例题:在指定范围内查找元素在数组的位置
5.数组排序算法
5.1 冒泡排序
冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就交换位置,直到没有任何一对数字需要交换为止。
使用冒泡排序算法的时间复杂度为O(n^2),不适合处理大规模的数据集,但它是一种非常简单、直观的排序算法,适用于小规模数据的排序。
算法实现:
5.2 直接选择排序
直接选择排序(Selection Sort)是一种简单直观的排序算法,它的基本思路是:每次从未排序的序列中选择最小的元素,将其放到已排序序列的末尾,直到所有元素都排好序为止。
直接选择排序的时间复杂度也为O(n^2),不适合处理大规模的数据集,但它的实现简单、容易理解,且在小规模数据的排序中表现优异。
算法实现:
5.3 反转排序
反转排序及将原来的数组元素反转并进行重新排序。
在上面的代码中,通过交换数组中对称位置上的元素,实现了数组的反转。例如,对于数组 {1, 2, 3, 4, 5},我们首先交换第一个元素 1 和最后一个元素 5,然后交换第二个元素 2 和倒数第二个元素 4,最后不用交换中间的元素 3。这样就实现了数组的反转。