zoukankan      html  css  js  c++  java
  • 大数据第六天

    数组概念

    数组是存储同一种数据类型多个元素的集合。也就是一个容器,这个容器有个名字,就是数组名。

    数组就是在内存中开辟出一段空间,这些内存空间在使用上是连续的,连续的下标值可以访问所有数组元素。

    数组既可以存储基本数据类型,也可以存储引用数据类型。

    String[] args;       引用数据类型

    byte[] buf;       基本数据类型

    int[] nums;       基本数据类型

    数组的定义格式

    数组定义格式1

    数据类型[] 数组名;

    int[] a;      定义一个int类型的数组a,里面的元素都是int类型

    String[] s;   定义一个String类型的数组s,里面的元素都是String类型

     

    数组定义格式2

    数据类型 数组名[];   //不推荐使用

    int a[]; 定义一个int类型的a数组变量

    推荐使用第一种格式,因为第一种的可读性更强。

    第二种早期的时候确实有很多人这样用。不过,现在这样用的人越来越少了。

     

    注意:这两种定义做完了,数组中是没有元素值的。

    如何对数组的元素进行初始化呢?

    数组的初始化

    Java中的数组必须先初始化,然后才能使用。

    所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值

    数组的初始化方式

    • 动态初始化:

        数组的创建和元素的赋值分开进行;

        初始化时只指定数组长度,由系统为数组分配默认初始值,元素的值可以在后面进行修改

    • 静态初始化:

        创建数组的时候就给每个数组元素赋值,由系统自动计算数组长度

     

     

    动态初始化:

    初始化时只指定数组长度,由系统为数组分配默认初始值,可以在以后再给元素赋其他的值

    格式:

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

    数组的类型其实也就是数组中各个元素的类型

    数组长度其实就是数组中元素的个数

    举例:

    int[] s ;         //1

    s = new int[3];   //2

    解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值。

    第一条语句只是在栈空间中定义了一个变量s,但是它还没有指向任何值,它的值是null;

     

    第二条语句在堆内存中开辟一段空间,可以存放3个int类型变量,并将s变量指向它的首地址,也就是第一个int值的地址。系统默认的初始值为0.布尔型的话,默认为false,引用类型的默认值为null。

     

    可以将创建变量和赋值语句可以写在同一条语句上:

    int[] s = new int[3];

    这一条语句实际上执行了三步操作,在栈空间中定义变量s,初始值为null,在堆空间开辟空间给数组,并将其中的元素赋初始值,将数组地址赋值给栈中的变量s

    案例:

    验证动态初始化数组的默认值:

    分别定义各种数据类型的数组,考察他们的初始值是多少。

    验证一下,多次new出来的数组的首地址(即数组名)是否相同?

    class ArrayDemo {

        public static void main(String[] args) {

           int[] arr = new int[3];

           System.out.println(arr); //打印数组的地址值:[I@175078b

           //通过数组名访问数据的格式是:数组名[索引];

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

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

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

        }

    }

    Java中的内存分配

    Java 程序在运行时,需要在内存中的分配空间。

    为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

     

    堆(heap)和栈(stack)内存图示:

    程序为了提高效率,对数据进行不同的空间的分配,主要有以下几个区域

    • 堆:存放的是所有new出来的东西
    • 栈:存放的是局部变量
    • 方法区:面向对象再讲
    • 本地方法区:和系统相关,不必考虑
    • 寄存器:供CPU使用,不必考虑

    堆内存的特点:

    • 每一个new出来的东西都有地址值
    • 堆中的每个变量都有默认值:

        byte,short,int,long为0;

        float,double为0.0;

        boolean为false;

        引用类型为null

    • 堆内存使用之后就成了垃圾,但是需要JVM在空闲的时候才会回收这些堆空间

     

    Java中数组的内存图解

    一个数组的情况

     

    图解1:

    定义一个数组,输出数组名(即首地址)及元素。然后给数组中的元素赋值,再次输出数组名及元素

    class ArrayDemo2 {

        public static void main(String[] args) {

           //定义一个数组

           int[] arr = new int[3];

           //输出数组名称

           System.out.println(arr);

           //输出数组元素值

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

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

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

           System.out.println("----");

           //给数组元素赋值

           arr[0] = 100;

           arr[2] = 200;

           //输出数组名称

           System.out.println(arr);

           //输出数组元素值

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

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

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

        }

    }

     

    内存中有两个数组的情况

    图解2:

    定义两个数组,分别输出数组名及元素。然后分别给数组中的元素赋值,分别再次输出数组名及元素

    class ArrayDemo3 {

        public static void main(String[] args) {

          

           int[] arr = new int[2];  //定义一个有两个int型元素的数组

           int[] arr2 = new int[3]; //定义一个有三个int型元素的数组

          

           //输出数组名和元素值

           System.out.println(arr);

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

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

           System.out.println("----");

          

           System.out.println(arr2);

           System.out.println(arr2[0]);

           System.out.println(arr2[1]);

           System.out.println(arr2[2]);

           System.out.println("----------------");

           //给元素重新赋值

           arr[1] = 20;

           arr2[1] = 30;

           arr2[0] = 40;

           //输出数组名和元素值

           System.out.println(arr);

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

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

           System.out.println("-----------------");

          

           System.out.println(arr2);

           System.out.println(arr2[0]);

           System.out.println(arr2[1]);

           System.out.println(arr2[2]);

        }

    }

    同类型数组变量之间互相赋值的情况

     

    图解3:

    定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。然后给第二个数组赋值,再次输出两个数组的名及元素。

    /*

        定义第一个数组,定义完毕后,给数组元素赋值。赋值完毕后,在输出数组名称和元素。

        定义第二个数组,定义完毕后,给数组元素赋值。赋值完毕后,在输出数组名称和元素。

        定义第三个数组,把第一个数组的地址值赋值给它。(注意类型一致),通过第三个数组的名称去把元素重复赋值。

        最后,再次输出第一个数组数组名称和元素。

    */

    class ArrayDemo4 {

        public static void main(String[] args) {

           //定义第一个数组

           int[] arr = new int[3];

           arr[0] = 88;

           arr[1] = 33;

           arr[2] = 66;

           System.out.println(arr);

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

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

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

           System.out.println("----");

          

           //定义第二个数组

           int[] arr2 = new int[3];

           arr2[0] = 22;

           arr2[1] = 44;

           arr2[2] = 55;

           System.out.println(arr2);

           System.out.println(arr2[0]);

           System.out.println(arr2[1]);

           System.out.println(arr2[2]);

           System.out.println("----");

          

           //定义第三个数组

           int[] arr3 =  arr;

           arr3[0] = 100;

           arr3[1] = 200;

           System.out.println(arr);

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

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

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

        }

    }

     

    数组内存结构的总结:

    1.目前为止,一提到数组,就应该想到会涉及到两种内存区域:一个是堆,一个是栈

    2.堆中存放的是数组的元素;栈中存放的是这个数组的引用(第一个元素的地址/首地址)

    静态初始化:

    初始化时就指定每个数组元素的初始值,由系统根据初始值的个数来决定数组长度。

    格式:

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

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

    举例:

        int[] arr = new int[]{1,2,3};

        简化的写法

    int[] arr = {1,2,3};

        解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别是1,2,3。

     

    示例:

    class ArrayDemo5 {

        public static void main(String[] args) {

           //定义数组

           int[] arr = {1,2,3};

          

           System.out.println(arr);

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

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

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

        }

    }

     

    验证:

    数组的动态和静态初始化是否能够同时使用?

    数组操作常见的两个小问题

    数组索引越界

    ArrayIndexOutOfBoundsException

    访问到了数组中的不存在的索引时发生,索引值超出了索引值的范围:-1,大于等于数组长度等

    空指针异常

    NullPointerException

    数组引用变量没有指向实体,却在操作实体中的元素

    class ArrayDemo6 {

        public static void main(String[] args) {

           //定义数组

           int[] arr = {1,2,3};

           //System.out.println(arr[3]);//数组越界

           //引用类型的常量:空常量 null

           arr = null;

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

        }

    }

    数组练习

    数组遍历(依次输出数组中的每一个元素)

    class ArrayTest {

        public static void main(String[] args) {

           //定义数组

           int[] arr = {11,22,33,44,55};

          

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

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

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

            System.out.println(arr[3]);

           System.out.println(arr[4]);

           System.out.println("--------------------");

    //挨个元素去输出,太麻烦,观察下标发现,都是连续的数,符合前面讲过的循环变量的特征

           for(int x=0; x<5; x++) {

               //x=0,1,2,3,4

               System.out.println(arr[x]);

           }

           System.out.println("--------------------");

           //从0开始我们是明确的,但是为什么到5呢,我们是数了一下数组的个数

           //继续看下个数组如何遍历

           int[] arr2 = {1,2,3,4,5,6,7,8,9,10,11,2,2,3,4,5,7,8,5,3,5,6,8,7,8,5,3,5,6,8,7,8,5,3,5,6,8,7,8,5,3,5,6,8,7,8,5,3,5,6,8};

           //而我们在很多时候,数组的元素不能靠数

           //这个时候,数组就给我们提供了一个属性:length专门用于获取数组的长度

           //格式:数组名.length 返回数组的长度

           System.out.println(arr.length);

           System.out.println(arr2.length);

           System.out.println("--------------------");

          

           //改进第一个程序

           for(int x=0; x<arr.length; x++) {

               System.out.println(arr[x]);

           }

           System.out.println("--------------------");

          

           //我们如果想要对多个数组进行遍历,每个数组的遍历我们都把代码写一遍,麻烦,所以,我们准备用方法改进,将遍历数组的代码封装到一个方法中

           //用方法改进后,请调用

           printArray(arr);

           System.out.println("--------------------");

           printArray(arr2);

           System.out.println("--------------------");

           printArray2(arr);

        }

        /*

           遍历数组的方法

           两个明确:

           返回值类型:void

           参数列表:int[] arr

        */

        public static void printArray(int[] arr) {

           for(int x=0; x<arr.length; x++) {

               System.out.println(arr[x]);

           }

        }

       

        //可以对上述方法进行改进,让打印效果更好

        public static void printArray2(int[] arr) {

           System.out.print("[");

           for(int x=0; x<arr.length; x++) {

               if(x == arr.length-1) { //这是最后一个元素

                  System.out.println(arr[x]+"]");

               }else {

                  System.out.print(arr[x]+", ");

               }

           }

        }

    }

    遍历数组多种写法,了解即可,不推荐这样用

    for(int i = 0; i < arr.length;){

        System.out.println(arr[i++]);

    }

    或者

    int i = 0;

    while(i < arr.length){

        System.out.println(arr[i++]);

    }

    数组获取最值(获取数组中的最大值,最小值)

     

    class ArrayTest2 {

        public static void main(String[] args) {

           //定义一个数组

           int[] arr = {34,98,10,25,67};

           /*

           //从数组中任意的找一个元素作为参照物

           int max = arr[0];

           //然后遍历其他的元素

           for(int x=1; x<arr.length; x++) {

               //依次获取和参照物进行比较,如果大就留下来,如果小,就离开。

               if(arr[x] > max) {

                  max = arr[x];

               }

           }

           //最后参照物里面保存的就是最大值。

           System.out.println("max:"+max);

           */

           //把这个代码封装成方法

           //调用方法

           int max = getMax(arr);

           System.out.println("max:"+max);

          

           //请获取数组中的最小值

           int min = getMin(arr);

           System.out.println("min:"+min);

        }

        /*

           需求:获取数组中的最大值

           两个明确:

           返回值类型:int

           参数列表:int[] arr

        */

        public static int getMax(int[] arr) {

           //从数组中任意的找一个元素作为参照物

           int max = arr[0];

           //然后遍历其他的元素

           for(int x=1; x<arr.length; x++) {

               //依次获取和参照物进行比较,如果大就留下来,如果小,就离开。

               if(arr[x] > max) {

                  max = arr[x];

               }

           }

           //最后参照物里面保存的就是最大值。

           return max;

        }

       

        public static int getMin(int[] arr) {

           //从数组中任意的找一个元素作为参照物

           int min = arr[0];

           //然后遍历其他的元素

           for(int x=1; x<arr.length; x++) {

               //依次获取和参照物进行比较,如果小就留下来,如果大,就离开。

               if(arr[x] < min) {

                  min = arr[x];

               }

           }

           //最后参照物里面保存的就是最小值。

           return min;

        }

    }

    数组元素逆序 (就是把元素对调)

    考察次数如何确定

    1,2,3,4,5

    5,4,3,2,1       2

    1,2,3,4

    4,3,2,1         2

    1,2,3,4,5,6    

    6,5,4,3,2,1     3

    1,2,3,4,5,6 ,7

    7,6,5,4,3,2,1       3

    /*

        数组元素逆序 (就是把元素对调)

        分析:

            A:定义一个数组,并进行静态初始化。

            B:思路

                把0索引和arr.length-1的数据交换

                把1索引和arr.length-2的数据交换

                ...

                只要做到arr.length/2的时候即可。

    */

    class ArrayTest3 {

        public static void main(String[] args) {

           //定义一个数组,并进行静态初始化。

           int[] arr = {12,98,50,34,76};

           //逆序前

           System.out.println("逆序前:");

           printArray(arr);

           //逆序后

           System.out.println("逆序后:");

           //reverse(arr);

           reverse2(arr);

           printArray(arr);

        }

        /*

           需求:数组逆序

           两个明确:

           返回值类型:void (有人会想到应该返回的是逆序后的数组,但是没必要,因为逆序前后的这两个数组其实是同一个数组)

           参数列表:int[] arr

        */

        public static void reverse(int[] arr) {

           /*

           //第一次交换

           int temp = arr[0];

           arr[0] = arr[arr.length-1-0];

           arr[arr.length-1-0] = temp;

           //第二次交换

           int temp = arr[1];

           arr[1] = arr[arr.length-1-1];

           arr[arr.length-1-1] = temp;

           //第三次交换

           int temp = arr[2];

           arr[2] = arr[arr.length-1-2];

           arr[arr.length-1-2] = temp;

           */

           //用循环改进

           for(int x=0; x<arr.length/2; x++) {

               int temp = arr[x];

               arr[x] = arr[arr.length-1-x];

               arr[arr.length-1-x] = temp;

           }

        }

        //以下方法,了解即可

        public static void reverse2(int[] arr) {

           for(int start=0,end=arr.length-1; start<=end; start++,end--) {

               int temp = arr[start];

               arr[start] = arr[end];

               arr[end] = temp;

           }

        }

        //遍历数组

        public static void printArray(int[] arr) {

           System.out.print("[");

           for(int x=0; x<arr.length; x++) {

               if(x == arr.length-1) { //这是最后一个元素

                  System.out.println(arr[x]+"]");

               }else {

                  System.out.print(arr[x]+", ");

               }

           }

        }

    }

    数组查表法(根据键盘录入索引,查找对应的元素)

    /*

        数组查表法(根据键盘录入索引,查找对应星期)

        意思是:String[] strArray = {"星期一","星期二",...};

    */

    import java.util.Scanner;

    class ArrayTest4 {

        public static void main(String[] args) {

           //定义一个字符串数组

           String[] strArray = {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};

    //{"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}

           //创建键盘录入对象

           Scanner sc = new Scanner(System.in);

          

           System.out.println("请输入一个数据(0-6):");

           int index = sc.nextInt();

           System.out.println("你要查找的日期是:"+strArray[index]);

        }

    }

    数组元素查找(查找指定元素第一次在数组中出现的索引)

     

    /*

        需求:数组元素查找(查找指定元素第一次在数组中出现的索引)

        分析:

            A:定义一个数组,并静态初始化。

            B:写一个功能实现

                遍历数组,依次获取数组中的每一个元素,和已知的数据进行比较

                如果相等,就返回当前的索引值。

    */

    class ArrayTest5 {

        public static void main(String[] args) {

           //定义一个数组,并静态初始化

           int[] arr = {200,250,38,888,444};

          

           //需求:我要查找250在这个数组中第一次出现的索引

           int index = getIndex(arr,250);

           System.out.println("250在数组中第一次出现的索引是:"+index);

          

           int index2 = getIndex2(arr,250);

           System.out.println("250在数组中第一次出现的索引是:"+index2);

          

           int index3 = getIndex2(arr,2500);

           System.out.println("2500在数组中第一次出现的索引是:"+index3);

        }

        /*

           需求:查找指定数据在数组中第一次出现的索引

           两个明确:

               返回值类型:int

               参数列表:int[] arr,int value

        */

        public static int getIndex(int[] arr,int value) {

           //遍历数组,依次获取数组中的每一个元素,和已知的数据进行比较

           for(int x=0; x<arr.length; x++) {

               if(arr[x] == value) {

                  //如果相等,就返回当前的索引值。

                  return x;

               }

           }

           //目前的代码有一个小问题

           //就是假如我要查找的数据在数组中不存在,那就找不到,找不到,你就对应的返回吗?

           //所以报错。

           //只要是判断,就可能是false,所以大家要细心。

            //如果找不到数据,我们一般返回一个负数即可,而且是返回-1

           //程序如果执行到这里,证明for循环中没有找到对应的值,即没有这个值

           return -1;

        }

       

        public static int getIndex2(int[] arr,int value) {

           //定义一个索引

           int index = -1;

           //有就修改索引值

           for(int x=0; x<arr.length; x++) {

               if(arr[x] == value) {

                  index = x;

                  break;

               }

           }

           //返回index

           return index;

        }

    }

    数组常见使用场景

           String mess = "今晚8点老地方见";

           byte[] bytes = mess.getBytes();

           byte key = 65;

           System.out.println("源字符串是:"+mess);

           for(int i = 0;i<bytes.length;i++) {

               bytes[i] = (byte)(bytes[i] ^ key);

           }

           System.out.println("加密后 :"+ new String(bytes));

          

           for (int i = 0; i < bytes.length; i++) {

               bytes[i] = (byte)(bytes[i] ^ key);

           }

           System.out.println("解密后 :"+ new String(bytes));

     

    利用按位异或运算将源字符串每个字符与一个特定的数字按位异或,得出的结果就是秘钥,要得到加密前的字符串,只需要将这个秘钥再次和特定的数字按位异或即可。

    二维数据

    概述

    我们每个班有很多个学生,所以,可以用数组来存储,而我们又同时有很多个班。这个也应该用一个数组来存储。如何来表示这样的数据呢?Java提供了二维数组供我们使用。

    由此可见,二维数组的本质是:每个元素都是一维数组的数组

     

    二维数组在堆中的示意图(每个元素指向的一维数组长度相同)

    二维数组定义方式一:每个元素长度相同

    指的是每个元素指向的一维数组的长度是相同的

    定义方式如下:

    数据类型[][] 变量名 = new 数据类型[m][n];

    m表示这个二维数组有多少个一维数组

    n表示每一个一维数组的元素个数

    举例:

    int[][] arr = new int[3][2];

       arr[0][1]

    定义了一个二维数组arr

    这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]

    每个一维数组有2个元素,可以通过arr[m][n]来获取

    表示获取第m+1个一维数组的第n+1个元素

    二维数组内存示意图

    /*

        二维数组:就是元素为一维数组的一个数组。

       

        格式1:

           数据类型[][] 数组名 = new 数据类型[m][n];

          

           m:表示这个二维数组有多少个一维数组。

           n:表示每一个一维数组的元素有多少个。

          

        注意:

           A:以下格式也可以表示二维数组

               a:数据类型 数组名[][] = new 数据类型[m][n];

               b:数据类型[] 数组名[] = new 数据类型[m][n];

           B:注意下面定义的区别

               int x;

               int y;

               int x,y;

              

               int[] x;

               int[] y[];

              

               int[] x,y[];

    */

    class Array2Demo {

        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

        }

    }

    二维数组定义方式二:每个元素长度不一定相同

    指的是每个元素所指向的一维数组的长度可以是不同的,根据具体情况而定

    定义格式如下:

    数据类型[][] 变量名 = new 数据类型[m][];

    m表示这个二维数组有多少个一维数组

    由于每个元素指向的一维数组长度不是固定的,所以没有直接给出,可以在接下来的程序中动态的指定每个元素具体指向的是多少个元素的一维数组

    举例:

    int[][] arr = new int[3][];//在栈内存中定义一个变量,指向堆内存中的一个数组

    arr[0] = new int[2];    //被指向的数组的第一个元素指向另一个长度为2的一维数组

    arr[1] = new int[1];    //被指向的数组的第二个元素指向另一个长度为1的一维数组

    arr[2] = new int[3];    //被指向的数组的第三个元素指向另一个长度为3的一维数组

     

    /*

        格式2:

            数据类型[][] 数组名 = new 数据类型[m][];

            m:表示这个二维数组有多少个一维数组。

            列数没有给出,可以动态的给。这一次是一个变化的列数。

    */

    class Array2Demo2 {

        public static void main(String[] args) {

           //定义数组

           int[][] arr = new int[3][];

          

           System.out.println(arr); //[[I@175078b

           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;

        }

    }

     

     

    演示代码:

    动态初始化二维数组

           int[][] arr = new int[3][];

           arr[0] = new int[2];

           arr[1] = new int[5];

           arr[2] = new int[3];

           int x = 1;

           for(int i = 0;i<arr.length;i++){

               for(int j = 0;j<arr[i].length;j++){

                  arr[i][j] = x++;

               }

           }

           //打印二维数组元素

           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();

           }

     

     

    格式3

        数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};

    简化版格式:

        数据类型[][] 变量名 = {new int[]{元素…},{元素…},{元素…}};

    举例:二维数组的静态初始化

        int[][] arr =  {{1,2,3},{4,6},{6}};

    /*

        格式3:

            基本格式:

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

            简化版格式:

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

               

            举例:

                int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};

                int[][] arr = {{1,2,3},{4,5},{6}};

    */

    class Array2Demo3 {

        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]); //错误

        }

    }

     

    二维数组的遍历

    二维数组的遍历类似于99乘法口诀表的打印,一定是循环的嵌套,外层循环控制的是第一维的遍历,内层循环控制的是第一维元素指向的一维数组的遍历

    /*

        需求:二维数组遍历

        外循环控制的是一维数组的个数。

        内循环控制的是一维数组的长度。

    */

    class Array2Test {

        public static void main(String[] args) {

           //定义一个二维数组

           int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};

          

           //请问谁代表{1,2,3}

           //arr[0]就是第一个数组

           //arr[0] = {1,2,3};

           for(int x=0; x<arr[0].length; x++) {

               System.out.println(arr[0][x]);

           }

           System.out.println("--------------");

          

           for(int x=0; x<arr[1].length; x++) {

               System.out.println(arr[1][x]);

           }

           System.out.println("--------------");

          

           for(int x=0; x<arr[2].length; x++) {

               System.out.println(arr[2][x]);

           }

           System.out.println("--------------");

          

           //用循环改进

           for(int x=0; x<arr.length; x++) {

               for(int y=0; y<arr[x].length; y++) {

                  System.out.print(arr[x][y]+" ");

               }

               System.out.println();

           }

           System.out.println("--------------");

          

           //用方法改进

           //调用方法

           printArray2(arr);

           System.out.println("--------------");

          

           //我们再来一个列数是变化的

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

           printArray2(arr2);

        }

       

        /*

           需求:遍历二维数组

           两个明确:

               返回值类型:void

               参数列表:int[][] arr

        */

        public static void printArray2(int[][] arr) {

           for(int x=0; x<arr.length; x++) {

               for(int y=0; y<arr[x].length; y++) {

                  System.out.print(arr[x][y]+" ");

               }

               System.out.println();

           }

        }

    }

  • 相关阅读:
    用CSV文件读写数据的两种方式(转)
    利用PHP生成二维码(转)
    PHP实现微博的同步发送(转)
    php实现网页标签补全方法(转)
    php 下载远程图片 的几种方法(转)
    Masonry+Infinite-Scroll实现无刷新无分页完美瀑布流(转)
    分享一个jQuery动态网格布局插件:Masonry(转)
    js判断图片是否显示
    PHP写入文件用file_put_contents代替fwrite优点多多(转)
    PHP 更高效的字符长度判断方法(转)
  • 原文地址:https://www.cnblogs.com/zhaoyongcx/p/6592433.html
Copyright © 2011-2022 走看看