Java-数组(一维数组)-二维数组

26 篇文章 0 订阅
12 篇文章 0 订阅

一、数组

1.1.什么是数组

        数组就是一组数

        在内存中的一片连续存储空间中保存的同类型数的集合

1.2.数组的创建

1.2.1.声明数组

//数组元素类型[] 数组名;
//type[] arrname;
int[] nums;

1.2.2.初始化数组

        值得注意的是,我们的初始化数组的时候,我们的数组名就是我们前面声明数组的时候的数组名,数组类型也得和我们前面声明数组时相同。

在我们数组的初始化过程中一共干了三件事情:

        1.在堆内存中开辟一块空间用来存储这个数组

        2.将这个空间按数组元素的个数分割

        3.将元素按顺序放入分割好的对应的内存块中

静态方式

方式一:通过new关键字进行初始化

//数组名 = new 数组类型[] {元素1,元素2,......}
nums = new int[] {1,2,3};

方式二:通过{}直接进行数组的初始化

        注意这种方式的初始化是必须在声明数组的时候同时进行初始化才可以,而且此方式只有数组拥有

//数组类型[] 数组名 = {元素1,元素2,......}
int[] nums = {1,2,3};

动态方式

        所谓的动态方式就是说,我们初始化的时候只需要指定数组的长度,并不指定数组的元素,虽然我们没有给数组添加值,但是我们的java本身会根据类型不同给我们添加对应的默认元素。

        byte/short/int/long数组类型                0
        double/float数组类型                          0.0
        char数组类型                                     空格
        Boolean数组类型                               false
        所用的引用数据类型的数组                null

//数组类型[] 数组名 = new 数组类型[数组长度]
int[] nums = new int[10];
//如果数组已经声明
//数组名 = new 数组类型[数组长度]
arr = new int[10];

        此时,我们的[]中的值是我们所指定的数组长度

        值得注意的是,我们在动态初始化数组之后还需要给数组对应的位置添加我们想要添加的元素。因为重复代码的原因,我们可以使用for循环、while循环等遍历的方法来添加数据。当然了,我们需要注意元素类型的一致。

1.3.数组的特性

1.3.1.length(长度不可变)

        我们每个数组在初始化后就会被确定,此时,这个数组的长度length也就有了意义。我们可以通过.length来得到我们想要查看的数组的长度

注意:
        1.一个数组的长度是不可改变的

1.3.2.索引(有序)

        索引是从0开始的整数。
        每个数组的索引都是在一个区间范围内的值,该区间为(0,该数组长度-1)
        当我们进行初始化之后,我们的数组中的每个元素,就会有一个对应的索引,我们可以通过这个索引来调用数组中对应的数组元素。

注意:
        1.当我们通过一个超出某一数组元素个数的索引来调用该数组的元素的时候,就会报错,越界

1.3.3.存储数据类型相同

1.3.4.引用数据类型

1.4.数组的遍历

1.4.1.通过for循环

		for(int i = 0;i < nums.length; i++) {
			System.out.println(nums[i]);
		}

1.4.2.通过增强for循环

		for(int i : nums) {
			System.out.println(i);
		}

1.5.数组的优缺点

1.5.1.优点

        1.检索速度非常快

1.5.2.缺点

        1.对内存要求很高(必须是连续存储),因此当一个数组的长度很长的时候,内存就不是很容易满足
        2.当我们删除或添加元素给一个数组的时候,效率会很低,他的本质是在内存空间重新开辟一个空间,长度为修改后的值,并将修改后的值复制到新的内存空间中,然后再把内存地址赋值给变量。

二、二维数组

2.1.什么是二维数组?

        数组就是用来存放一系列相同数据的集合,当我们把这里的一个个数据换成一个个数组的时候,就是我们的二维数组。
        借用维度的定义,一个个点组成了线,就是一维;一条条线组成的面是二维。
        二维数组也可以理解成一个数组就是一条线,就是一个一维;多个数组组成的数组,就是二维。也就是说,外层数组是二维,里层数组是一维。

2.2.二维数组的声明

2.2.1.语法

//数组元素类型[][] 数组名;
//type[][] array_name;
int[][] nums;

2.3.二维数组的初始化

2.3.1.静态初始化

方式一:通过new关键字进行初始化

//数组名 = new 数组类型[][] {{元素1,元素2,...},{元素1,元素2,...},......}
nums = new int[][] {{1,2,3},{4,5},{6}};

方式二:通过{}直接进行数组的初始化

        注意这种方式的初始化是必须在声明数组的时候同时进行初始化才可以,而且此方式只有数组拥有

//数组类型[][] 数组名 = {{元素1,元素2,...},{元素1,元素2,...},......}
int[][] nums = {{1,2,3},{4,5},{6}};

2.3.2.动态初始化

       所谓的动态方式就是说,我们初始化的的时候先指定数组的长度,并不指定数组的元素,虽然我们没有给数组添加值,但是我们的java本身会根据类型不同给我们添加对应的默认元素。

        byte/short/int/long数组类型                0
        double/float数组类型                          0.0
        char数组类型                                     空格
        Boolean数组类型                               false
        所用的引用数据类型的数组                null

方式一、第一维和第二维的数组都指定长度 

//数组类型[][] 数组名 = new 数组类型[外层二维数组的长度][内层的每一个一维数组的长度]
int[][] nums = new int[10][5];
//如果数组已经声明
//数组名 = new 数组类型[外层二维数组的长度][内层的每一个一维数组的长度]
arr = new int[10][5];

方式二、只给第二维指定长度,在之后分别按需给一维数组设置长度

//数组类型[][] 数组名 = new 数组类型[外层二维数组的长度][]
int[][] nums = new int[10][];
//如果数组已经声明
//数组名 = new 数组类型[外层二维数组的长度][]
arr = new int[10][];

//给一维数组设置长度
//数组名[二维索引] = new 数据类型[一维长度];
arr[0] = new int[10];
//或者是静态赋值一维数组
//数组名[二维索引] = new 数据类型[]{值列表...};
arr[0] = new int[] {1,2,3}

        此时,我们的[]中的值是我们所指定的数组长度

        值得注意的是,我们在动态初始化数组之后还需要给数组对应的位置添加我们想要添加的元素。因为重复代码的原因,我们可以使用for循环、while循环等遍历的方法来添加数据。当然了,我们需要注意元素类型的一致。  

2.4.二维数组的使用

        数组的使用都是跟随索引进行操作使用的

2.4.1.语法

        二维数组名[外层索引][内层索引]

2.4.二维数组的遍历

        外层for循环遍历外层的二维数组,内存for循环用来遍历内层的每一个一维小数组

2.4.1.普通for循环嵌套普通for循环

		for (int i = 0; i < nums.length; i++) {
			for (int j = 0; j < nums[i].length; j++) {
				System.out.println(nums[i][j]);
			}
		}

2.4.2.普通for循环嵌套增强for循环

		for (int i = 0; i < nums.length; i++) {
			for (int j : nums[i]) {
				System.out.println(j);
			}
		}

2.4.3.增强for循环嵌套普通for循环

		for (int i : nums) {
			for (int j = 0; j < i.length; j++) {
				System.out.println(i[j]);
			}
		}

2.4.4.增强for循环嵌套增强for循环

		for (int i : nums) {
			for (int j : i) {
				System.out.println(j);
			}
		}

三、Arrays静态工厂

        通过Oracle官方找到对应的文档来查看方法的使用,以及方法的功能

3.1.常用方法总结与测试

3.1.1.前提准备

int[] arr1 = {3,1,5,4,2};
int[] arr2 = {3,1,5,4,2};

char[][] arr3 = {{'a','b'},{'c','d','e'}};
char[][] arr4 = {{'a','b'},{'c','d','e'}};

3.1.2.常用方法

一维数组

1.static String toString(int[] a)

        返回指定数组内容的字符串表示形式。

System.out.println(Arrays.toString(arr1));

判断数组是否相等

2.static boolean equals(int[] a, int[] a2)

        如果两个指定的int数组彼此 相等 ,则返回 true 。

System.out.println(arr1==arr2);
System.out.println(Arrays.equals(arr1,arr2));

多维数组

3.static boolean deepEquals(Object[] a1, Object[] a2)

        如果两个指定的数组彼此 深度相等 ,则返回 true 。

System.out.println(Arrays.equals(arr3,arr4));
System.out.println(Arrays.deepEquals(arr3,arr4));

4.static String deepToString(Object[] a)

        返回指定数组的“深层内容”的字符串表示形式。

System.out.println(Arrays.toString(arr3));
System.out.println(Arrays.deepToString(arr3));

5.static void fill(boolean[] a, boolean val)

        将指定的布尔值分配给指定的布尔数组的每个元素。

boolean[] arr5 = new boolean[10];
System.out.println(Arrays.toString(arr5));
Arrays.fill(arr5,true);
System.out.println(Arrays.toString(arr5));

6.static void fill(boolean[] a, int fromIndex, int toIndex, boolean val)

        将指定的布尔值分配给指定的布尔数组的指定范围的每个元素。 结束索引位置不包含

Arrays.fill(arr5,3,6,false);
System.out.println(Arrays.toString(arr5));

升序排列

7.static void sort(int[] a)

        将指定的数组按升序排序。

System.out.println(Arrays.toString(arr1));
Arrays.sort(arr1);

8.static void sort(int[] a, int fromIndex, int toIndex)

        按升序对数组的指定范围进行排序。

Arrays.sort(arr1,1,4);//注意这里的测试需要注释掉上面的排序代码
System.out.println(Arrays.toString(arr1));

判断数组是否有某个值

9.static int binarySearch(int[] a, int key)

        使用二进制搜索算法在指定的int数组中搜索指定的值。如果不存在返回(-插入点-1) ---> 默认数组升序排序为前提

Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));
System.out.println( Arrays.binarySearch(arr2,6));;  //-插入点-1

数组拷贝

10.static int[] copyOf(int[] original, int newLength)

        使用零复制指定的数组,截断或填充(如有必要),以使副本具有指定的长度。

        original                 原数组
        newLength           新数组的长度

        1.当newLength == original.length 原数组长度

        拷贝

int[] newArr = Arrays.copyOf(arr1,5);
System.out.println(Arrays.toString(newArr));
System.out.println(arr1==newArr);

        2.当newLength < original.length 原数组长度

        截取 : 从原数组中所有为0的位置开始,拷贝newLength个到新数组中

System.out.println(Arrays.toString(Arrays.copyOf(arr1,3)));

        3.当newLength > original.length 原数组长度

        填充 : 原数组中的数据原封不动拷贝到新数组中,剩余空间默认值填充

System.out.println(Arrays.toString(Arrays.copyOf(arr1,10)));

11.static int[] copyOfRange(int[] original, int from, int to)

        将指定数组的指定范围复制到新数组中。 结束索引一般不包含

System.out.println(Arrays.toString(Arrays.copyOfRange(arr1,1,3)));

注意:

        copyOf与copyOfRange实现拷贝,新数组都是方法内部创建的,不是用户手动创建

解决:

        当我们的目的地数组需要用户手动指定,可以使用下面这个方法

12.static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

        将指定源数组中的数组从指定位置开始复制到目标数组的指定位置。

int[] arr6 = new int[8];
System.arraycopy(arr1,1,arr6,4,3);
System.out.println(Arrays.toString(arr6));
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要计算二维数组的行列式,可以使用行列式的定义来计算。假设给定一个二维数组A,其行数为n,列数为m,则该二维数组可以表示为A = [a_ij],其中i表示行索引,j表示列索引。 对于一个2x2的二维数组,其行列式计算公式为: |a b| |c d| = ad - bc 对于一个大于2x2的二维数组,可以使用余子式和代数余子式来计算其行列式。具体步骤如下: 1. 选择一行或一列作为基准,假设选择第一行。 2. 将基准行或列的每个元素看作一个小矩阵的左上角元素,然后计算这个小矩阵的行列式。这个小矩阵的行列式称为该元素的余子式。 3. 对于每个余子式,乘以该元素的代数余子式,得到一个数值。奇数行奇数列的元素代数余子式为该元素的余子式的相反数,偶数行偶数列的元素代数余子式为该元素的余子式。 4. 将所有数值相加得到最终的行列式的值。 下面是Java代码实现该算法的示例: ```java public static int determinant(int[][] A) { int n = A.length; int m = A[0].length; if (n != m) { throw new IllegalArgumentException("Matrix is not square."); } int det = 0; if (n == 2) { det = A[0][0] * A[1][1] - A[0][1] * A[1][0]; } else { for (int j = 0; j < m; j++) { int[][] M = new int[n - 1][m - 1]; for (int i = 1; i < n; i++) { for (int k = 0; k < m; k++) { if (k < j) { M[i - 1][k] = A[i][k]; } else if (k > j) { M[i - 1][k - 1] = A[i][k]; } } } int sign = (j % 2 == 0) ? 1 : -1; det += sign * A[0][j] * determinant(M); } } return det; } ``` 该算法的时间复杂度为O(n!),其中n为二维数组的大小。如果需要计算更大的二维数组的行列式,可以考虑使用高斯消元或LU分解等更高效的算法。 ### 回答2: 矩阵乘法是线性代数中的基础运算之一,也是计算机科学中经常用到的运算之一。在Java中,使用二维数组表示矩阵,可以通过循环嵌套实现矩阵乘法。 矩阵乘法的原理是将矩阵A的行与矩阵B的列对应相乘再求和,得到矩阵C中对应位置的值。具体实现过程如下: 1. 定义两个二维数组表示矩阵A和矩阵B。 ```java int[][] A = {{1, 2, 3}, {4, 5, 6}}; int[][] B = {{7, 8}, {9, 10}, {11, 12}}; ``` 2. 创建一个二维数组表示矩阵C,其行数等于矩阵A的行数,列数等于矩阵B的列数。 ```java int[][] C = new int[A.length][B[0].length]; ``` 3. 循环嵌套计算矩阵乘法。外层循环控制行数,内层循环控制列数。 ```java for(int i = 0; i < A.length; i++) { for(int j = 0; j < B[0].length; j++) { for(int k = 0; k < A[0].length; k++) { C[i][j] += A[i][k] * B[k][j]; } } } ``` 4. 输出矩阵C的值。 ```java for(int i = 0; i < C.length; i++) { for(int j = 0; j < C[0].length; j++) { System.out.print(C[i][j] + " "); } System.out.println(); } ``` 完整代码如下: ```java public class MatrixMultiplication { public static void main(String[] args) { int[][] A = {{1, 2, 3}, {4, 5, 6}}; int[][] B = {{7, 8}, {9, 10}, {11, 12}}; int[][] C = new int[A.length][B[0].length]; for(int i = 0; i < A.length; i++) { for(int j = 0; j < B[0].length; j++) { for(int k = 0; k < A[0].length; k++) { C[i][j] += A[i][k] * B[k][j]; } } } for(int i = 0; i < C.length; i++) { for(int j = 0; j < C[0].length; j++) { System.out.print(C[i][j] + " "); } System.out.println(); } } } ``` 以上就是Java数组之二维数值数组之矩阵乘的实现过程。矩阵乘法虽然简单,但重要性不容忽视,尤其在计算机视觉、图像处理、机器学习等领域应用广泛。 ### 回答3: 矩阵乘是矩阵运算中的一种基本操作,也是数值计算中十分重要的一个问题。在Java中,我们可以通过二维数组来实现矩阵乘法。下面,我们就来看看如何通过Java数组练习矩阵乘法。 首先,我们需要了解矩阵乘法的相关知识。设有两个矩阵A和B,它们的维度分别为m*n和n*p,则它们的乘积C为一个m*p的矩阵,其中C[i][j]的值为A[i][0]*B[0][j]+A[i][1]*B[1][j]+...+A[i][n-1]*B[n-1][j]。 根据这个公式,我们可以写出Java代码来实现矩阵乘法。 例如,假设我们要计算矩阵A和B的乘积C,代码可以如下所示: ``` public static int[][] matrixMul(int[][] A, int[][] B) { int m = A.length; int n = A[0].length; int p = B[0].length; int[][] C = new int[m][p]; for (int i = 0; i < m; i++) { for (int j = 0; j < p; j++) { for (int k = 0; k < n; k++) { C[i][j] += A[i][k] * B[k][j]; } } } return C; } ``` 在这段代码中,我们首先定义了矩阵A、B和C的相关维度,然后用一个三重循环遍历每一个C[i][j]的值,并根据矩阵乘法公式计算出每个C[i][j]的值。 示例: ``` int[][] A = {{1, 2, 3}, {4, 5, 6}}; int[][] B = {{7, 8}, {9, 10}, {11, 12}}; int[][] C = matrixMul(A, B); //输出结果 for (int i = 0; i < C.length; i++) { for (int j = 0; j < C[0].length; j++) { System.out.print(C[i][j] + " "); } System.out.println(); } ``` 执行以上代码,会输出如下结果: ``` 58 64 139 154 ``` 这就是矩阵A和B的乘积C。 总之,通过这段代码的理解和实践,我们可以更好地掌握Java数组的使用,以及矩阵乘法的实现方法。同时,在实际工作中,我们也可以根据类似的思路,来解决一些涉及二维数组的数值计算问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值