Java之二维数组【一篇搞定】

二维数组

如果把普通的数组(一维数组),看作一个小盒子的话,盒子里面可以存放很多数据,那么二维数组就是像一个大点的盒子,里面可以存放很多小盒子(一维数组)。

1 定义格式

二维数组固定定义格式有2种,具体如下:

格式1:

数据类型[][] 数组名 = new 数据类型[一维长度m][二维长度n];

​ m:表示二维数组的元素数量,即可以存放多少个一维数组​

​ n:表示每一个一维数组,可以存放多少个元素

格式2:

数据类型[][] 数组名 = new 数据类型[一维长度][];

案例展示:

package com.briup.chap04;

import java.util.Arrays;

public class Test091_Basic {
	public static void main(String[] args) {
		//一维长度2,代表这个二维数组里面包含2个元素,每个元素都是一个一维数组
		//二维长度3,代表这个二维数组中元素,类型都是int[3]的一维数组,存放3个int数据
		int[][] arr = new int[2][3];
		/*
			[[I@15db9742

			[[: 		2个中括号就代表的是2维数组
			I: 			数组中存储的数据类型为int
			15db9742: 	十六进制内存地址
		*/
		System.out.println(arr);

		//二维数组的每个元素值(第一维), 对应的是一维数组的内存地址值
		System.out.println(arr[0]);	//[I@15db9742
		System.out.println(arr[1]);	//[I@6d06d69c

		System.out.println("--------------");
		
		//第二种定义格式
		int[][] arr2 = new int[2][];
        
        //输出arr2中2个元素值,默认为null、null
		System.out.println(Arrays.toString(arr2));
		
		//给二维数组的每个元素赋值
		//arr[0] = new int[2];
		//arr[1] = new int[3];
	}
}

2 内存结构

一维数组内存结构:

在这里插入图片描述

二维数组内存结构:

​ 可以把二维数组看成一个一维数组,数组的每个元素对应的内存区域中,存放的是一维数组引用值,具体可参考下面2个图:

在这里插入图片描述在这里插入图片描述

3 元素访问

二维数组中元素的访问和赋值,也是通过数组下标实现的。

书写格式:

二维数组名[一维下标m][二维下标n];

​ 例如:int arr[2][3];

注意:m、n的取值都是[0,length-1],注意不要越界,否则会出现异常ArrayIndexOutOfBoundsException

案例展示

package com.briup.chap04;

public class Test093_Access {
	public static void main(String[] args) {
	    // 数据类型[][] 变量名 = new 数据类型[m][n];
	    int[][] arr = new int[2][3];

	    //获取二维数组元素值并输出
	    System.out.println(arr[0][0]);
	    System.out.println(arr[1][1]);
	    
	    System.out.println("-----------");

	    // 向二维数组中存储元素
	    arr[0][0] = 11;
	    arr[0][1] = 22;
	    arr[0][2] = 33;

	    arr[1][0] = 11;
	    arr[1][1] = 22;
	    arr[1][2] = 33;

	    //arr[2][0] = 3;  数组越界异常
	    
	    // 3. 遍历二维数组,获取所有元素,累加求和
	    for (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();
	    }
	}
}

4 初始化

​ 二维数组的静态初始化,有点类似一维数组的初始化,具体格式如下:

完整格式 :

数据类型[][] 数组名 = new 数据类型[][]{ {元素1, 元素2...} , {元素1, 元素2...}, ...};

简化格式 :

数据类型[][] 数组名 = { {元素1, 元素2...} , {元素1, 元素2...} ...};

案例

package com.briup.chap04;

public class Test094_Init {
    //封装二维数组遍历方法
	public static void outArray(int[][] arr) {
	    // 遍历二维数组,获取所有元素,累加求和
	    for (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();
	    }
	} 
	
    public static void main(String[] args) {
        //第一种:完整格式
		int[][] arr1 = new int[][]{{1,2,3},{4,5}};
        outArray(arr1);

        System.out.println("----------");
        
        //第二种:简化格式
        int[][] arr2 = {{11, 22, 33}, {44, 55}};
        outArray(arr2);

        System.out.println("----------");
        
        //第三种:建议从内存角度理解
        int[] arr3 = {11, 33};
        int[] arr4 = {44, 55, 66};
        int[][] array = {arr3, arr4};
        outArray(array);
    }
}

5 综合案例

案例1:二维数组元素遍历

//上面案例已经使用
public static void outArray(int[][] arr) {
    // 遍历二维数组,获取所有元素,累加求和
    for (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();
    }
} 

案例2:二维数组元素求和

package com.briup.chap04;

public class Test095_Sum {
    public static void main(String[] args) {
        // 1. 定义求和变量,准备记录最终累加结果
        int sum = 0;
        
        // 2. 使用二维数组来存储数据
        int[][] arr = new int[3][];
        arr[0] = new int[]{10};
        arr[1] = new int[]{20,20};
        arr[2] = new int[]{30,30,30};
        //思考,下面一行代码是否正确
        //arr[2] = {30,30,30};
        
        // 3. 遍历二维数组,获取所有元素,累加求和
        for (int i = 0; i < arr.length; i++) {
            for(int j = 0; j < arr[i].length; j++){
                sum += arr[i][j];
            }
        }
        
        // 4. 输出最终结果
        System.out.println(sum);
    }
}

案例3:创建杨辉三角并输出

使用二维数组,打印输出杨辉三角,效果如下:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

具体实现:

package com.briup.chap04;

public class Test095_Triangle {
	public static void main(String[] args) {
        //1.定义2维数组
		int[][] arr = new int[5][5];
		
		//2.给二维数组赋值,得到杨辉三角
		for(int i = 0; i < arr.length; i++) {
			for(int j = 0; j < arr[i].length; j++) {
				//a.j==0  第一列都为 1
				if(j == 0)
					arr[i][j] = 1;
				else if(i == j) {
				//b. 行和列相同  设置1
					arr[i][j] = 1;
				}else if(i > j) {
				//c. 当前位置值 == 上一行相同列 + 上一行前一列
					arr[i][j] = arr[i-1][j] + arr[i-1][j-1];
				}
			}
		}
		
		//3.遍历二维数组,输出杨辉三角
		for(int i = 0; i < arr.length; i++) {
			for(int j = 0; j < arr[i].length; j++) {
				//只输出 左下部分,右上部分0值不输出
				if(i >= j)
					System.out.print(arr[i][j] + "\t");
			}
			System.out.println();
		}
	}
}
主要内容: 1. 数组的定义 2. 数组的分类[按数] 3. 数组的用法 4. 数组的常见操作 java中的foreach实现方式 一数组 1. 定义:省略 2. 用法: 声明并赋值: //方法一:先声明,再赋值 int [] arr=new int[5]; arr[0]=10; arr[4]=100; arr[5]=10;//语法无误,编译时报错:java.lang.ArrayIndexOutOfBoundsException System.out.println(arr[5]);//语法无误,编译时报错:错误同上 //方法二:使用for循环动态赋值 //导入java.util.*;包 Scanner input=new Scanner(System.in); int [] arr=new int[5]; for(int i=0;i<arr.length;i++) { System.out.println("请输入第"+(i+1)+"个值"); arr[i]=input.nextInt(); } //方法三:声明时赋值 int [] arr=new int[]{23,45,56,67}; int [] arr1={23,45,56,67}; int [] arr2= new int[5]{23,45,56,67};//错误,此时不能给确定的长度 输出: int [] arr=new int[]{23,45,56,67}; //方法一:使用for循环输出 for(int i=0;i<arr.length;i++) { System.out.println(arr[i]); } //方法二:使用foreach输出:此为JDK5.0 新特性 for(int item : arr) { System.out.println(item); } 常见算法: 1. 求一数组中的最大[小]值 2. 求一数组中的总和,平均值 3. 添加,删除,修改,搜索等 具体请参考本人FTP\\5.0S1\\JAVA\\数组完整操作范例。[重复让人如此崩溃!] 二维数组 1. 定义:省略 2. 用法: 声明并赋值: //声明时赋值 int [][]arr={ {1,2,3}, {4,5,6}, {7,8,9} }; 输出: //方法一:使用嵌套for循环输出二维数组 for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { System.out.print(arr[i][j]+" "); } System.out.println(); } //方法二:使用嵌套foreach输出二维数组 for(int row[] :arr) //此时不难看出,二维数组可以看作是每个元素都是一个一数组的一数组 { for(int item: row) { System.out.print(item+ " "); } System.out.println(); } 补充: //动态创建规则二维数组 int R=10;//行 int N=5;//列 int [][]arr=new int ­[N]; //动态创建不规则二维数组 int arr[][]; arr=new int[2][]; arr[0]=new int[10]; arr[1]=new int[5]; 赋值都一样:此处省略! 算法体验:杨辉三角 int i,j; int a[][]=new int[10][10]; //给每行的第一列,及对角线处均赋值为1 for(i=0;i<10;i++) { a[i][0]=1; a[i][i]=1; } //从arr[2][1]=a[1][0]+a[1][1]; //推出:a[i][j]=a[i-1][j-1]+a[i-1][j]; //即元素等于两肩之和 for(i=2;i<10;i++) { for(j=1;j<i;j++) { a[i][j]=a[i-1][j-1]+a[i-1][j]; } } for(i=0;i<10;i++) { for(j=0;j<=i;j++) { System.out.print(a[i][j]+" "); } System.out.println(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值