打怪升级之小白的大数据之旅(八)<Java基础语法之二维数组>

打怪升级之小白的大数据之旅(八)

Java基础语法之二维数组


目录

打怪升级之小白的大数据之旅(八)

上次回顾

 

二维数组

二维数组的定义

二维数组的声明与初始化

声明

初始化

二维数组的遍历

二维数组的内存图分析

数组操作的常见异常

总结



上次回顾

上一期我们讲完了Java的数组的第一部分,数组的基本概念,本章开始分享数据的一些基础算法,由浅入深,下一章,会提到几个常见的排序,好了,开始进入正题


二维数组

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


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



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

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

二维数组的定义

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

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

二维数组的声明与初始化

声明

  • 声明一个二维数组
    int[][] arr;
  • 语法格式
    //推荐
    元素的数据类型[][] 二维数组的名称;
    //不推荐
    元素的数据类型  二维数组名[][];
    //不推荐
    元素的数据类型[]  二数组名
    

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

初始化

  • 初始化如同一维数组一样,同样有两种方法
    • 静态初始化
      //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]);
          }
      }
      

      动态初始化创建可以不用声明里面一维数组的长度,因此,它每个一维数组长度可以不一样,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的一些基本语法就完啦,下一章开始介绍面向对象,面向对象细节比较多,依旧是重在理解,理解,多做做案例,我抽空整理一下案例题,方便各位搭配我的文章进行知识点巩固,查漏补缺~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值