Java基础语法之二维数组详解

一、二维数组

进入正题之前.首先为了便于大家理解,我画了一个图:
xx枪战游戏中, 我是一个刚刚注册账号的小白,系统送了我两把枪,此时,我的武器库只有这么一层(可以理解为一位数组,枪就是对应的数组中对应的元素)

经过艰苦卓绝的战斗,终于有了一笔钱,现在我打算配置好的游戏装备,我现在有了一个枪柜,它可以存放三层的枪械,每一层都可以放多把武器(这个就是二维数组,有多层,每层都是一个一维数组)

随着游戏时长和我的高超技术,获取游戏装备的效率越来越高了,一个枪柜已经存不下了,于是,我就有了多个枪柜(这个就是多维数组,单个维度存放的就是单个的二维数组,单个二维数组中有多个一维数组~):

上图从一维数组到多维数组的演变~是不是很形象,哈哈~

二维数组的定义

  • 二维数组,本质上就是一个数组,它内部又包含了多个一维数组
  • 二维数组也可以看成一个二维表,行*列组成的二维表,只不过这个二维表,每一行的列数还可能不同。但是每一个单元格中的元素的数据类型是一致的,例如:都是int,都是String等

  • 二维数组的标记: [][]

二、二维数组的声明与初始化

2.1 声明

  • 声明一个二维数组
  • int[][] arr;

语法格式

//推荐
元素的数据类型[][] 二维数组的名称;
//不推荐
元素的数据类型  二维数组名[][];
//不推荐
元素的数据类型[]  二数组名

照例,我把一些不推荐但是不会造成编译异常的写法放上,因为有的面试题会遇到,有印象就好

2.2 初始化

  • 初始化如同一维数组一样,同样有两种方法

2.2.1 静态初始化

//1.先声明,再静态初始化
元素的数据类型[][] 二维数组名;
二维数组名 = new 元素的数据类型[][]{
			{元素1,元素2,元素3 。。。},
			{第二行的值列表},
			...
			{第n行的值列表}
		};
//2.声明并同时静态初始化
元素的数据类型[][] 二维数组名 = new 元素的数据类型[][]{
			{元素1,元素2,元素3 。。。},
			{第二行的值列表},
			...
			{第n行的值列表}
		};
//3.声明并同时静态初始化的简化写法
元素的数据类型[][] 二维数组的名称 = {
			{元素1,元素2,元素3 。。。},
			{第二行的值列表},
			...
			{第n行的值列表}
		};
//声明二维数组
int[][] arr;
//静态初始化
arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
//arr = new int[3][3]{{1,2,3},{4,5,6},{7,8,9}};//错误,静态初始化,右边new 数据类型[]中不能指定长度
//声明并同时初始化
int[][] arr = new int

示例代码1:

public class Array2Demo1 {
	public static void main(String[] args) {
		//定义数组
		int[][] arr = {{1,2,3},{4,5},{6}};

		System.out.println(arr);
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);

		System.out.println(arr[0][0]); //1
		System.out.println(arr[1][0]); //4
		System.out.println(arr[2][0]); //6

		System.out.println(arr[0][1]); //2
		System.out.println(arr[1][1]); //5
		//越界
		System.out.println(arr[2][1]); //错误
	}
}

示例代码2:

public class TwoArryTest {
    public static void main(String[] args) {
        // 静态初始化
        // 定义一个二维数组MM资源库
        String[][] girls = new String[][]{ {"北方小姐姐","南方小姐姐","台湾小姐姐"},{"东京小姐姐","北海道小姐姐"},{"俄罗斯小姐姐","纽约小姐姐","乌克兰小姐姐"} };
         /*
        * 打印各个维度数组的元素
        * 在我的认知中,世界上最美的MM国家分布
        * 于是我创建了一个二维数组MM资源库,总共分为三个一位数组,
        * 分别来自,中国,日本和其他国家的小姐姐~~
        * 另外,每个地区我都放入了一些地区的小姐姐进去
        * */
        // 获取第一个数组中的北方小姐姐
        System.out.println(girls[0][0]);
        // 获取第一个数组中的南方小姐姐
        System.out.println(girls[0][1]);
        // 获取第二个数组中的东京小姐姐
        System.out.println(girls[1][0]);
        // 获取第三个组中的乌克兰小姐姐
        System.out.println(girls[2][2]);
    }
}

2.2.2 动态初始化

动态初始化创建可以不用声明里面一维数组的长度,因此,它每个一维数组长度可以不一样,so,就有了下面两种初始化方式:

  • 动态初始化一(规则二维表)

程序员指定数组的长度,后期再赋值(系统会先给定元素默认初始值)

规则二维表:每一行的列数是相同的

格式

//(1)确定行数和列数
元素的数据类型[][] 二维数组名 = new 元素的数据类型[m][n];
m:表示这个二维数组有多少个一维数组。或者说一共二维表有几行
n:表示每一个一维数组的元素有多少个。或者说每一行共有一个单元格

//此时创建完数组,行数、列数确定,而且元素也都有默认值
//(2)再为元素赋新值
二维数组名[行下标][列下标] = 值;

示例代码:

public static void main(String[] args) {
    //定义一个二维数组
    int[][] arr = new int[3][2];

    //定义了一个二维数组arr
    //这个二维数组有3个一维数组的元素
    //每一个一维数组有2个元素
    //输出二维数组名称
    System.out.println(arr); //地址值	[[I@175078b

    //输出二维数组的第一个元素一维数组的名称
    System.out.println(arr[0]); //地址值	[I@42552c
    System.out.println(arr[1]); //地址值	[I@e5bbd6
    System.out.println(arr[2]); //地址值	[I@8ee016

    //输出二维数组的元素
    System.out.println(arr[0][0]); //0
    System.out.println(arr[0][1]); //0
}

动态初始化二(不规则二维表)

不规则二维表:每一行的列数可能不一样

格式

//(1)先确定总行数
元素的数据类型[][] 二维数组名 = new 元素的数据类型[总行数][];
//此时只是确定了总行数,每一行里面现在是null
//(2)再确定每一行的列数,创建每一行的一维数组
二维数组名[行下标] = new 元素的数据类型[该行的总列数];
//此时已经new完的行的元素就有默认值了,没有new的行还是null
//(3)再为元素赋值
二维数组名[行下标][列下标] = 值;

不规则二维表,声明后,初始话内部一维数组时不能简写

// 不规则二维表
// 定义二维数组
int[][] arr = new int[3][]; // 3行,未知的列

// 初始化二维数组内的元素值
arr[0] = new int[]{1}; // 此处不能简写为 arr[0] = {1}
arr[1] = new int[]{2,3};
arr[2] = new int[]{4,5,6,7};

示例代码1:

public class TwoArryTest {
    public static void main(String[] args) {
        //定义数组
        int[][] arr = new int[3][];
        System.out.println(arr);	//[[I@175078b
        System.out.println(arr[1][0]);//NullPointerException
        System.out.println(arr[0]); //null
        System.out.println(arr[1]); //null
        System.out.println(arr[2]); //null
        //动态的为每一个一维数组分配空间
        arr[0] = new int[2];
        arr[1] = new int[3];
        arr[2] = new int[1];
        System.out.println(arr[0]); //[I@42552c
        System.out.println(arr[1]); //[I@e5bbd6
        System.out.println(arr[2]); //[I@8ee016
        System.out.println(arr[0][0]); //0
        System.out.println(arr[0][1]); //0
        //ArrayIndexOutOfBoundsException
        //System.out.println(arr[0][2]); //错误
        arr[1][0] = 100;
        arr[1][2] = 200;
    }
}

示例代码2:

public class TwoArryTest {
    public static void main(String[] args) {

        // 动态初始化
        /*
        * 定义一个二维数组的枪柜,
        * 它存放了三层枪械,
        * 第一层存放的是狙击枪,第二层存放的是步枪,第三层存放的是辅助武器
        * 我买了这个枪柜,但并不是每一层存放的枪械数量相等,因此,我需要动态初始化这个枪柜(数组)
        * */
        String[][] Guns = new String[3][];

        // 将两把狙击枪放入第一层狙击枪的枪柜中
        String[] GunMagazine = {"AWM","Bird sniper"};

        // 后来,我又买了三把步枪,也需要存放到枪柜里
        String[] rifle = {"AK47","M4A1 QBZ95"};

        // 装备很齐全了,下面,我还需要一些配件,辅助我取得游戏胜利
        String[] auxiliaryWeapon = {"(手枪)pistol","(手雷)antitank grenade", "(烟雾弹)smoke bomb"};
    }
}

注意事项:如果是静态初始化,右边new 数据类型[][]中不能写数字,因为行数和列数,由{}的元素个数决定

三、二维数组的遍历

  • 二维数组的遍历,同一维数组一样,区别就是,我们首先在外循环,遍历每一个一维数组,内循环中的 I 就是每一个一维数组的内存伪地址
  • 格式
for(int i=0; i<二维数组名.length; i++){
    for(int j=0; j<二维数组名[i].length; j++){
        System.out.print(二维数组名[i][j]);
    }
    System.out.println();
}

四、二维数组的内存图分析

二维数组再内存图中的流程,如下图:

流程步骤:

1.首先创建main方法,这个main方法会存在栈内存中,(这个内存中的栈,堆前面有提到过,忘了没关系,我下一章还会再分享一下)

2.静态初始化创建二维数组arr, 于是在栈内存中,创建一个 int[][] arr= 

3.在栈内存创建二维数组int[][]时,里面的值会在堆内存开辟一个空间,左边的是二维数组,因为存储了三个一维数组,因此,它有三个元素,右边分别开辟三个一维数组的内存空间

4.每个内存空间都有一个地址,二维数组中存储的是一维数组的地址,而栈内存int[][]arr = 存储的是二维数组的内存地址

5.所以,第一个打印arr的二维数组是Java源码转换后的内存地址,第二个是二维数组中第一个一维数组的内存地址

6.第三个打印是二维数组中第一个一维数组中的第一个元素

五、数组操作的常见异常

数组越界异常

示例代码:

public static void main(String[] args) {
   int[] arr = {1,2,3};
   System.out.println(arr[3]);
}

越界异常图

异常原因

创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此我们不能访问数组中不存在的索引,程序运行后,将会抛出 ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码

数组空指针异常

示例代码:

 public static void main(String[] args) {
        //定义数组
        int[][] arr = new int[3][];
       
       System.out.println(arr[0][0]);//NullPointerException
   }

空指针异常图

异常原因

异常原因:因为此时数组的每一行还未分配具体存储元素的空间,此时arr[0]是null,此时访问arr[0][0]会抛出NullPointerException 空指针异常。

六、总结

本章介绍了一下二维数组的相关介绍,至此,数组和Java的一些基本语法就完啦,下一章开始介绍面向对象,面向对象细节比较多,依旧是重在理解,理解,多做做案例,我抽空整理一下案例题,方便各位搭配我的文章进行知识点巩固,查漏补缺~~

到此这篇关于Java基础语法之二维数组详解的文章就介绍到这了,更多相关Java二维数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java编程实现的二维数组转置功能示例

    本文实例讲述了Java编程实现的二维数组转置功能.分享给大家供大家参考,具体如下: /** * 实现二维数组的转置 * @author HAN * */ public class transposition_Arrays2D_ch6_4 { final static double PI=3.1415; public static void main(String[] args) { /*StaticTest st1=new StaticTest(); StaticTest st2=new Sta

  • Java用Arrays.fill()初始化二维数组的实现

    在最短路径问题上遇到了一个问题,对于二维int数组 map[][],需要初始化为int的最大值,不想用双重循环赋初值,想用Arrays.fill()填充但是失败了...... 首先说明,Arrays.fill()并不能提高赋值的效率,在函数的内部也是用for循环的方式 实现的. fill()函数源码: public static void fill(Object[] a, Object val) { for (int i = 0, len = a.length; i < len; i++) a[

  • java二维数组实现推箱子小游戏

    本文实例为大家分享了java实现推箱子小游戏的具体代码,供大家参考,具体内容如下 二维数组 二维数组:类似于二维表格(有很多层,每一层有多个房间的楼房) 数组声明: 数据类型[][]数据名 = new 数据类型[行数][列数]; 获取二维数组的长度:数组名.lengt 得到的是行数 数组名[行下标].length 得到的是列数 推箱子小游戏 import java.util.Random; import java.util.Scanner; /* * 推箱子的小游戏 */ public clas

  • Java二维数组与动态数组ArrayList类详解

    Java二维数组 Java 语言中提供的数组是用来存储固定大小的同类型元素. 1.二维数组初始化和声明 数组变量的声明,和创建数组可以用一条语句完成,如下所示: int a[][] = new int[2][3]; int[][] arr = {{1,2,3},{4,5,6},{7,8,9}}; 2.二维数组遍历 //遍历二维数组 public class Traverse_a_two_dimensional_array { public static void main(String[] ar

  • java二维数组遍历的2种代码

    二维数组遍历: 思想: 1.先将二维数组中所有的元素拿到 2.再将二维数组中每个元素进行遍历,相当于就是在遍历一个一维数组 第一种方法:双重for循环 //遍历二维数组 public class Traverse_a_two_dimensional_array { public static void main(String[] args) { // TODO Auto-generated method stub int[][] arr = new int[2][3];//动态创建:2个元素(外

  • Java数组的定义、初始化、及二维数组用法分析

    本文实例讲述了Java数组的定义.初始化.及二维数组用法.分享给大家供大家参考,具体如下: 数组的定义 1.数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来做唯一标识. 数组的分类 一维数组 二维数组 多维数组 数组的优点: 例如:定义100个整型变量.用数组很方便. 数组声明: 1.int [] array; 2.int array []; 数组的声明以及内存的分配 1.为数组分配内存空间,如果不分配内存,将不能访问它的任何元素.我们使用new关键字来为数组分配内存空间. int

  • java二维数组指定不同长度实例方法

    我们知道二维数组,是在一维数组的基础上进行了维度的增加.那么在实际使用的过程中,有时候我们所需要的二维数组,它们其中的维度是不同的,这就需要我们手动的进行设置.下面我们就来一起探究,二维数组在改变维度长度大小的方法,并辅以实例进行代码展示. 1.二维数组的每个元素都是一个一维数组,这些数组不一定都是等长的.声明二维数组的时候可以只指定第一维大小,空缺出第二维大小,之后再指定不同长度的数组.但是注意,第一维大小不能空缺(不能只指定列数不指定行数). public class ArrayTest4

  • Java二维数组实战案例

    本文实例讲述了Java二维数组.分享给大家供大家参考,具体如下: 一 点睛 1 每行的元素个数不同的二维数组 Java定义二维数组更加灵活,允许二维数组中的每行的元素个数不相等,这点与其他编程语言不同,例如下面这个二维数组,其中第1行有4个元素,第2行有3个元素,第3行有5个元素 int [][] num={ {1,2,3,4}, {1,2,3}, {1,2,3,4,5} }; 下面的语句是声明整型的二维数组num并分配空间,其中第1行4个元素,第2行3个元素,第3行5个元素 int [][]

  • Java二维数组查找功能代码实现

    题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目分析: 根据二维数组的特点可知,二维数组相当于一个矩阵: 根据题意可知该数组是有序的,因此该矩阵元素相当于是从小到大排列的: 如果从左下角开始查找较方便,因为左下角的值向上是递减的,向右是递增的: 当从左下角开始比较时,如果target传入的数大于它则列数加一进行比较 ,如果小于它则行数减

  • java int类型二维数组实现“杨辉三角”的完整实例

    杨辉三角的规律: 1.每行的数据个数和在第几行一样. 2.每行第一个数和最后一个数都是1. 3.每行除了第一个数据和最后一个数据 其他数据的值等于上面一行的对应列的值和左对角值的和.例如:a[2][1]=a[1][0]+a[1][1] 根据上面的规律我们设计程序 private static void demo(){ int[][] ints = new int[10][]; //动态给ints数组的一维赋值一个不同的数组 for (int i = 0; i < ints.length; i++

  • 详解Java中一维、二维数组在内存中的结构

    前言 我们知道在Java中数组属于引用数据类型,它整个数组的数组元素既可以是基本数据类型的(如 byte \ int \ short \ long \ float \ double \ char \ boolean 这些),也可以是引用数据类型的.当它的数组元素是基本数据类型时,这个数组就是一个一维数组:当它的数组元素是引用数据类型时,它就是一个多维数组.比如,在一个数组中它的某个元素值其实是一个一维数组,而其他不同的元素也各自包含了一个一维数组,我们就把这个包含很多个一维数组的数组叫做二维数组

  • Java编程一维数组转换成二维数组实例代码

    简介:由于经常在使用矩阵进行计算时,会首先将一维数组转为二维数组.因此,在这里记录一下,也希望对他人有帮助. 实例代码: package deal; public class ArryTest { public static void main(String[] args) { //创建一个一维数组 0,1,2,3...,10 double [] c= new double[10]; for (int i = 0; i < c.length; i++) { c[i]=i; } double[][

随机推荐