四.一维数组及二维数组

一、数组

1.1 概念

  • 数组是引用数据类型。
  • 数组:数据的组合。
  • 将多个数据存储到一起,每个数据称为该容器的元素。存储元素的容器,容器里存的是元素。
  • 之前学习的变量,一个变量只能存一个数据,如果我们要存储多个数据,就需要一个容器,当下我们要掌握的第一个容器,数组。

1.2 数组的概述

  • 数据类型 变量名 = 值;
  • 数组可以是基本数据类型,也可以是引用数据类型。

1.3 数组的定义

package com.atguigu.e_array;
/*
* 1.定义语法
*   数据类型[] 数组名;  掌握
*   数据类型 数组名[];   了解
* 注意:数组和变量一样,必须要初始化才可使用
* */
public class ArrayDefineTest1 {
    public static void main(String[] args) {
        //变量:必须要初始化才能使用
        int a;
//        System.out.println("a = " + a);

        //数组
        int[] arr;
//        System.out.println("arr = " + arr);

    }
}

1.4 数组的初始化

package com.atguigu.e_array;
/*
* 数组的初始化:
*   1.动态初始化:在定义数组的同时,指定数组的长度(空间的大小)
*       数据类型[] 数组名 = new 数据类型[长度];  常用的
*       数据类型[] 数组名;
*       数组名 = new 数据类型[长度];
*   2.静态初始化:在定义数组的同时,赋值,值的个数就决定了数组的长度
*       数据类型[] 数组名 = {值1,值2,值3}; 值的个数决定数组的长度  常用的
*       数据类型[] 数组名 = new 数据类型[]{值1,值2,值3};
*
*   注意:
*       1.直接输出数组,输出的是数组在内存的地址值。
* */
public class ArraySetValueTest2 {
    public static void main(String[] args) {

        //定义一个int类型的数组叫arr,并在内存中开辟5块连续的空间
        int[] arr = new int[5];
        double[] scores = new double[100];
        byte[] bytes;
        bytes = new byte[5];

        System.out.println("--------");
        int[] arrs = {4,3,5,2,1};
        int[] arrs2 = new int[]{5,6,7,8,9};
        System.out.println(arrs);//直接输出数组,输出的地址值
    }
}

1.5 数组的赋值与访问

package com.atguigu.e_array;
/*
* 数组的赋值:
*   1.下标/索引:下标是从0开始的。
*       数组名[下标] = 值;
*       数组名[下标] 取值
*   2.获取数组的长度
*       数组名.length; 获取数组的长度
*       数组名[数组名.length-1]:获取的是数组的最后一个元素
		数组的下标是从0开始,到数组的长度-1   [0,数组.length-1]
* */
public class ArrayUseTest3 {
    public static void main(String[] args) {
        int[] arr = new int[5];
        System.out.println("arr = " + arr);//输出的是地址值。
        //数组的赋值
        arr[0] = 100;
        arr[1] = 200;
        arr[2] = 300;
        arr[3] = 400;
        arr[4] = 500;
        System.out.println("arr = " + arr[4]);
        System.out.println(arr.length);//获取数组的长度  空间的个数
        System.out.println(arr[arr.length - 1]);//获取数组长度-1的下标元素  数组的最后一个元素
    }
}

1.6 数组的默认值

package com.atguigu.e_array;
/*
* 8个基本、1个引用
* 整数:默认值是0
* 浮点数:默认值是0.0
* char类型:'\u0000' 0 空格  直接输出char类型数组,输出的不是地址值,而是所有的元素(值)
* 布尔型:默认值是false
* 引用数据类型的默认值全是null   空
*
* 注意:如果访问的下标<0 或 >数组.length-1 则会报:
*  ArrayIndexOutOfBoundsException 数组越界(用非法索引访问数组时抛出的异常)
* */
public class ArrayDefaultValueTest4 {
    public static void main(String[] args) {
        System.out.println("整数类型的数组默认值:");
        byte[] bytes = new byte[5];
        System.out.println("bytes = " + bytes);
        System.out.println(bytes[0]);
        short[] shorts = new short[5];
        int[] arr = new int[5];
        long[] longs = new long[5];
        System.out.println(shorts[0]);
        System.out.println(arr[0]);
        System.out.println(longs[0]);

        System.out.println("浮点数类型的数组默认值:");
        float[] floats = new float[3];
        double[] doubles = new double[3];
        System.out.println(floats[0]);
        System.out.println(doubles[2]);

        System.out.println("char类型的数组默认值:");
        char[] chars= new char[3];
        System.out.println(chars[1]);
        System.out.println(chars);//直接输出char类型数组,输出的不是地址值,而是所有的元素(值)

        System.out.println("布尔类型的数组默认值:");
        boolean[] booleans = new boolean[3];
        System.out.println(booleans[0]);

        System.out.println("String类型的数组默认值:");
        String[] strs = new String[3];
        System.out.println(strs[1]);

        System.out.println(strs[4]);
    }
}

1.7 数组的遍历

  • 方式一:借助for循环,使用下标访问

  • package com.atguigu.e_array;
    /*
    * 数组的遍历:
    *   指从第一个元素一直访问到最后一个元素。
    *        0      .length-1
    *   借助for循环。 i从0开始,循环条件是<数组.length
    *
    * */
    public class ArrayEachTest5 {
        public static void main(String[] args) {
            //静态初始化
            String[] girlFriends = {"迪丽热巴", "热依扎", "古力娜扎", "马尔扎哈", "哈妮克孜", "佟丽娅","萨勒芬妮"};
    
            for (int index = 0; index < girlFriends.length; index++) {
                System.out.println(girlFriends[index]);
            }
    
            System.out.println("===========");
            //对数组快捷生成遍历循环
            for (int i = 0; i < girlFriends.length; i++) {
                System.out.println(girlFriends[i]);
            }
    
        }
    }
    
    
  • 方式二:增强for循环

  • package com.atguigu.e_array;
    /*
    *增强for和fori的抉择:
    *   从头到尾依次遍历 增强for更好,无需关注下标,避免下标越界
    *   选择性遍历  fori更好
    *   倒序遍历,用fori更好
    * */
    public class ArrayForeachTest6 {
        public static void main(String[] args) {
            String[] strs = {"外星人","Rog","联想","华硕","苹果"};
            System.out.println("==== 增强for ====");
            //语法糖 :程序员写着少,但是编译后,本质上还是fori
            for(String str: strs){
                System.out.println(str);
            }
    
    
            System.out.println("====== fori =====");
            for (int i = 0; i < strs.length; i++) {
                System.out.println(strs[i]);
            }
    
            System.out.println("==== 倒序遍历 ====");
            for(int i = strs.length-1; i>=0; i--){
                System.out.println(strs[i]);
            }
        }
    }
    
    

二、数组操作练习

2.1 求数组中的最大值

package com.atguigu.a_array;
/*
* 定义一个整数数组
* 遍历整个数组,获取最大值
* 没有下标的体现,增强for
* */
public class ArrayExerTest1 {
    public static void main(String[] args) {
        int[] arr = {13,14,99,77,66,43};

        //假象最大值:假象数组下标0就是最大的
        int maxNum = arr[0];

        //将每一个元素取出来,
        for (int i : arr) {
            //判断,当前取出的值
            if(maxNum < i){
                //最大值小于当前遍历的值。替换
                maxNum = i;
            }
        }

        System.out.println(maxNum);
    }
}

2.2 求数组最小值及下标

package com.atguigu.a_array;
/*
* 定义一个数组, 遍历,获取其最小值,及第一次出现的下标
* 定义一个数组
* 定义一个最小值的变量
* 定义一个记录最小元素下标的变量
* 只要有下标的体现,选择fori
* 如果求最后一个 加上=号
*
* */
public class ArrayExerTest2 {
    public static void main(String[] args) {
        //1.定义一个数组
        int[] arr = {10,30,-71,40,50,-71};

        //2.定义一个假象最小值的变量
        int minNum = arr[0];
        //3.定义一个假象最小值的下标
        int index = 0;

        //4.使用for遍历,操作下标
        for (int i = 1; i < arr.length; i++) {
            if(minNum > arr[i]){
                //替换最小值
                minNum = arr[i];
                //记录下标
                index = i;
            }
        }
        System.out.println("minNum = " + minNum+",下标为:"+index);
    }
}

2.3 求数组中最大值及下标、最小值及下标、求和、平均值

package com.atguigu.a_array;

/*
 * 定义一个数组
 * 求数组中最大值、最大值的下标、最小值、最小值的下标、数组的总和、数组的平均值
 * */
public class ArrayExerTest3 {
    public static void main(String[] args) {
        int[] arr = {10, 20, 30, 40, 50, 9};

        //定义变量 最大值 最大值下标 最小值 最小值下标
        int maxNum = arr[0], maxIndex = 0, minNum = arr[0], minIndex = 0, sum = 0;

        for (int i = 0; i < arr.length; i++) {
            //当前最大值 小于 当前遍历的数组元素
            if (maxNum < arr[i]) {
                maxNum = arr[i];
                maxIndex = i;
            }
            //当前最小值 大于 当前遍历的数组元素
            if (minNum > arr[i]) {
                minNum = arr[i];
                minIndex = i;
            }
            //无论是最大还是最小,都不能影响累加求和
            sum+=arr[i];
        }
        System.out.println("最大值:"+maxNum+",其下标为:"+maxIndex);
        System.out.println("最小值:"+minNum+",其下标为:"+minIndex);
        System.out.println("总和为:"+sum);
        System.out.println("平均值为:"+ (double)sum / arr.length );
    }
}

2.4 综合练习

package com.atguigu.a_array;

import java.util.Scanner;

/*
* 从控制台输入学生的人数。
* 创建学生的成绩数组,数组的长度为学生的人数
* 统计学生的总分数,计算平均分。
* 从控制台输入多个学生的成绩。
* */
public class ArrayExerTest4 {
    public static void main(String[] args) {
        //1.创建控制台输入对象
        Scanner input = new Scanner(System.in);
        System.out.println("请输入学生的人数:");
        int num = input.nextInt();

        //2定义学生的成绩数组。 数组的长度为学生的人数
        double[] scores = new double[num];
        //累加求和的变量
        double sum = 0.0;

        //3.fori循环,循环输入学生的成绩,存储到数组里。
        for (int i = 0; i < scores.length; i++) {
            System.out.println("请输入第"+(i + 1)+"名学生的成绩:");
            double score = input.nextDouble();
            //判断成绩是否合理
            if(score<0){
                System.out.println("输出的成绩有误,必须是大于0的成绩");
                //为了下一次的循环,还是本次循环的i的值
                i--;
                continue;//跳出本次不合理的循环,进入下一次重新输入
            }
            scores[i] = score;
            //将数组中的元素取出来累加求和
            sum +=scores[i];
        }

        //4.输出数组的平均分
        System.out.println("平均分为:"+sum / scores.length);
    }
}

2.5 综合练习优化迭代部分

package com.atguigu.a_array;

import java.util.Arrays;
import java.util.Scanner;

public class ArrayExerTest5 {
    public static void main(String[] args) {
            //1.创建控制台输入对象
            Scanner input = new Scanner(System.in);
            System.out.println("请输入学生的人数:");
            int num = input.nextInt();
            //2定义学生的成绩数组。 数组的长度为学生的人数
            double[] scores = new double[num];
            //累加求和的变量
            double sum = 0.0;

            //3.fori循环,循环输入学生的成绩,存储到数组里。
            for (int i = 0; i < scores.length; ) {
                System.out.println("请输入第"+(i + 1)+"名学生的成绩:");
                double score = input.nextDouble();
                //判断成绩是否合理
                if(score<0){
                    System.out.println("输出的成绩有误,必须是大于0的成绩");
                    continue;//跳出本次不合理的循环,进入下一次重新输入
                }
                scores[i] = score;
                //将数组中的元素取出来累加求和
                sum +=scores[i];
                i++;//其实还是迭代部分,只不过控制了一下正确执行完毕,才进行i++迭代操作
            }

            //4.输出数组的平均分
            System.out.println("平均分为:"+sum / scores.length);
    }
}

三、JVM内存划分

  • JVM内存,其实运行时数据区

  • 空间划分:

    • 方法区(元空间):存储的类的信息 包名、类名。。。 静态信息 常量信息
    • 虚拟机栈(栈空间):方法运行时产生的局部变量信息。每当有一个方法执行时,在栈中为方法开辟一块空间,栈帧。
    • 堆:对象、数组
    • 程序计数器(寄存器):存储下一步要执行代码的指令、地址。用于存储当前代码执行时,保存的是分支、流程跳转的下一步的指令。
    • 本地方法栈:Java不是万能的。 有些功能是靠C/C++来实现的 其他语言在执行代码时,所占的空间在这里。

四、数组常见算法

4.1 数组的反转

package com.atguigu.c_operator;

import java.util.Arrays;
/*
* Arrays.toString(数组名); 可以快速展示数组中的元素,以String的格式
* 1.首尾互换
*   找到中间下标。 互换的中间下标的左右两侧
*   左侧下标从0开始,右侧下标是从数组的长度-1 - 左侧的下标值
* 2.定义左侧的下标值  右侧的下标值
*         l :0        r:数组的长度-1
*          l++         r--
* */
public class ArrayReverseTest1 {
    public static void main(String[] args) {
        int[] arr = {10,20,30,40,50,60,70};
        //70 60 50 40 30 20 10
        //1.如果想快速看数组中的元素   从头到尾
        System.out.println("反转前 = " + Arrays.toString(arr));

        for(int i = 0;i< arr.length / 2;i++){
            int temp = arr[i];
            arr[i] = arr[arr.length - 1 - i];
            arr[arr.length - 1 -i] = temp;
        }

        System.out.println("反转后 = "+Arrays.toString(arr));
    }
}
class ArrayReverseTest2{
    public static void main(String[] args) {
        int[] arr = {10,20,30,40,50,60,70};
        //70 60 50 40 30 20 10
        //1.如果想快速看数组中的元素   从头到尾
        System.out.println("反转前 = " + Arrays.toString(arr));

        for(int l = 0,r = arr.length-1;l < r;l++,r--){
            int temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
        }

        System.out.println("反转后 = "+Arrays.toString(arr));
    }
}

4.2 数组的扩容与缩容

package com.atguigu.c_operator;

import java.util.Arrays;

/*
* 数组的长度问题:
*  数组在定义后,无论是静态、动态初始化,长度一旦固定,则不可更改。
*
* 数组的扩容:原数组,空间不足,扩容一个新的数组,存储数据
*   1.创建一个新数组
*   2.将旧数组中的元素原位复制到新数组中
*   3.将新数组地址赋值给旧的数组
*
* 数组的缩容:
*   已经存储元素的数组,最后一个下标之前的元素被删除。那么后续的元素要往前移动
* */
public class ArrayCapacityTest2 {
    public static void main(String[] args) {
        //           0 1 2 3 4
        int[] arr = {4,3,5,2,1};

        //1.创建新数组
        int[] newArr = new int[arr.length << 1];//arr.length * 2

        //2.将旧数组的值复制到新数组中
        for (int i = 0; i < arr.length; i++) {
            newArr[i] = arr[i];//复制的是值
        }

        //3.将新数组的地址赋值给旧数组
        arr = newArr;

        arr[5] = 100;
        //4.展示
        System.out.println(Arrays.toString(arr));

    }
}
class ArrayCapacityTest3{
    public static void main(String[] args) {
        //todo 删除指定下标的元素
        //           0 1 2 3 4
        int[] arr = {4,3,5,2,1};
        //删除下标2的元素,赋值为0
        //要将删除元素下标后的元素往前移动
        arr[2] = 0;//删除下标2的元素
        //循环起始从被删除元素的下标开始
        for(int i = 2;i<arr.length - 1;i++){
            arr[i] = arr[i+1];
        }
        //将最后一位元素赋值为0.可以存储其他新的值
        arr[arr.length-1] = 0;

        System.out.println("缩容后= "+Arrays.toString(arr));
    }
}

4.3 顺序查找

package com.atguigu.c_operator;

import java.util.Scanner;

/*
* 定义一个数组  int[] arr = {4,3,5,2,1};
* 请输入一个数:
*           5
*   有5这个元素,下标是2   第一次出现的下标
*
* 请输入一个输:
*       100
*       未查到元素100
*
* */
public class ArrayFindTest3 {
    public static void main(String[] args) {
        int[] arr = {4,3,5,2,1};

        Scanner input = new Scanner(System.in);
        System.out.println("请输入要查找的数字:");
        int num = input.nextInt();

        //todo 假设查找的元素所在的下标
        int index = -1;
        for (int i = 0; i < arr.length; i++) {
            if(num == arr[i]){
                index = i;//将找到的元素所在的下标记录下来
                break;
            }
        }
        //对下标变量做判断
        if(index == -1){
            System.out.println("未找到元素"+num);
        }else{
            System.out.println("有"+num+"这个元素,下标为:"+index);
        }

    }
}

4.4 数组的排序

package com.atguigu.d_sort;

import java.lang.reflect.Array;
import java.util.Arrays;

/*
* 冒泡排序:相邻的两个元素比较大小,交换位置
* 0 - 1 -2
* 1、从下标0开始, 只要前一个元素 > 后一个元素,就交换位置
* 2、每次排序,都是将本次比较最大的放到最后面
* 3、一个有n个元素的数组,比较的轮数是 n -1轮
* 4、比较的次数会随着轮数的增长而减少
* */
public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {4,3,5,2,1};
        //外层循环控制的是轮数
        for(int i = 0;i<arr.length - 1;i++){
            //内层循环控制的是次数 次数随着轮数的增长递减
            for(int j = 0;j<arr.length - 1 - i;j++){
                if(arr[j] > arr[j + 1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }

        System.out.println(Arrays.toString(arr));
    }
}
/*
//第一轮  比的是最大的
        for(int i = 0;i<arr.length - 1;i++){
            if(arr[i] > arr[i + 1]){
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }

        //第二轮 比的是第二大的

* for(int i = 0;i<arr.length - 1 - 1;i++){
            if(arr[i] > arr[i + 1]){
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }

        //第三轮 比的是第三大的
        for(int i = 0;i<arr.length - 1 - 1 - 1;i++){
            if(arr[i] > arr[i + 1]){
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }

        //第四轮
        for(int i = 0;i<arr.length - 1 - 1 - 1 - 1;i++){
            if(arr[i] > arr[i + 1]){
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
*
*
*
*
* */

五、二维数组

5.1 概述

  • 一维数组存储的是元素。
  • 二维数组存储的是一维数组。 将数组作为值存储给另一个数组。

5.2 定义

package com.atguigu.a_two;
/*
* 定义方式:
* 数据类型[][] 数组名;  常用
* 数据类型[] 数组名[]; 不推荐
* 数据类型 数组名[][]; 不推荐
* */
public class TwoArrayTest1 {
    public static void main(String[] args) {

        String name = "猴精";

        String[] arr = {"蜘蛛精","白骨精","黑熊精","耗子精",name};

        String[] arr2 = {"孙悟空","猪八戒","唐僧","猫精"};

        System.out.println("arr2 = " + arr2);

        //定义二维数组
        String[][] arr3 = {arr,arr2};
        System.out.println("arr3 = " + arr3);

    }
}

5.3 初始化

  • 静态初始化:

    • package com.atguigu.a_two;
      
      /*
       * 静态初始化:编译时就确定了数组长度、元素
       *  数据类型[][] 数组名 = {{值1,值2,值3},{值n},{}}; 声明和赋值必须在一行
       *   数据类型[][] 数组名 = new 数组类型[][]{{},{},{}};声明和赋值可以换行
       * 动态初始化:
       * */
      public class TwoArrayInitTest2 {
          public static void main(String[] args) {
              int[] nums = {4, 3, 5, 2, 1};
              //               0           1         2
              int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8}};
      
              //二维数组名.length,获取的是二维数组的长度
              System.out.println("arr.length = " + arr.length);
      
              //数组名[0];  二维数组当中的第一个一维数组的空间
              System.out.println("arr[0] = " + arr[0]);//[I@6d03e736
      
              //数组名[0][1];  二维数组中第一个一维数组中的第二个元素
              System.out.println("arr[0][1] = " + arr[0][1]);
      
              String[][] strArr;
              strArr = new String[][]{{"安琪拉","米莱迪","王昭君"},{"夏侯惇","吕布"},{"鲁班"}};
      
              System.out.println("strArr.length = " + strArr.length);
              System.out.println("strArr[1].length = " + strArr[1].length);
              System.out.println("strArr[2][0] = " + strArr[2][0]);
              
          }
      }
      
      
  • 动态初始化

    • package com.atguigu.a_two;
      /*
      *
      * 动态初始化:编译时就指定了数组的长度、默认值
      *   数据类型[][] 数组名 = new 数据类型[数值1][数值2];
      *       数值1 是二维数组的行。 代表一维数组的数量
      *       数值2 是一维数组的列  代表一维数组的元素个数
      *   数据类型[][] 数组名 = new 数据类型[数值1][];
      * */
      public class TwoArrayInitTest3 {
          public static void main(String[] args) {
      //        int[] arr = new int[3];
              //todo 数据类型[][] 数组名 = new 数据类型[数值1][数值2];
              //第一个[]代表的是行  第二个[]代表的是列
              int[][] arr = new int[3][5];
              System.out.println("arr。 = " + arr.length);
              System.out.println("arr[0].length = " + arr[0].length);
              System.out.println("arr[0].length = " + arr[1].length);
              System.out.println("arr[0].length = " + arr[2].length);
      
              //todo 数据类型[][] 数组名 = new 数据类型[数值1][];
              //只动态分配了行。 列可以换行后单独指定
              int[][] arr2 = new int[3][];
              arr2[0] = new int[16];//为二维中的每个下标单独分配一维的长度
              arr2[1] = new int[3];
              //静态初始化赋值,必须用下述语法,不能换行。
              arr2[2] = new int[]{6,6,6,6,6};
      
      
          }
      }
      
      

5.4 二维数组的遍历

  • fori遍历

    • /*
       * fori遍历
       * 增强for遍历
       *       for(数组的类型 数组名:数组名){
       *       }
       * */
      public class TwoArrayForTest4 {
          public static void main(String[] args) {
              //                          0                       1                   2
              String[][] names = {{"安琪拉", "米莱迪", "王昭君"}, {"吕布", "程咬金"}, {"赵云", "刘备", "李白", "韩信"}};
              //外层循环控制的是二维数组的行
              for (int i = 0; i < names.length; i++) {
                  //内层循环控制的是一维数组的列
                  for (int j = 0; j < names[i].length; j++) {
                      //i是二维的下标  j是一维的下标
                      System.out.print(names[i][j] + "\t");
                  }
                  System.out.println();
              }
              /*//todo 遍历二维数组中的第一个一维数组
              for(int i =0;i<names[0].length;i++){
                  System.out.print(names[0][i]+"\t");
              }
              System.out.println();
      
              //todo 遍历二维数组中的第二个一维数组
              for(int i =0;i<names[1].length;i++){
                  System.out.print(names[1][i]+"\t");
              }
              System.out.println();
              //todo 遍历二维数组中的第三个一维数组
              for(int i =0;i<names[2].length;i++){
                  System.out.print(names[2][i]+"\t");
              }
              System.out.println();*/
          }
      }
      
  • 增强for遍历

    • class TwoArrayForPlusTest5 {
          public static void main(String[] args) {
              //                          0                       1                   2
              String[][] names = {{"安琪拉", "米莱迪", "王昭君"}, {"吕布", "程咬金"}, {"赵云", "刘备", "李白", "韩信"}};
              //外层增强for每次遍历拿到的是一个一个的一维数组
              for (String[] name : names) {
                  //内层增强for每次遍历拿到的是一个一个的元素
                  for (String n : name) {
                      System.out.print(n+"\t");
                  }
                  System.out.println();
              }
          }
      }
      

5.5 二维数组的小练习

  • 求二维数组中最大值和最小值

    • package com.atguigu.a_two;
      /*
      * 定义一个整数二维数组,将整个二维数组中最大值和最小值取出来
      * */
      public class TwoArrayExerTest6 {
          public static void main(String[] args) {
              int[][] arrs = {{10,57,18},{33,12,99},{-9,82,-736,115}};
              //1.先定义假想最大值
              int maxNum = arrs[0][0];
              int minNum = arrs[0][0];
              //遍历的是二维数组   拿到的是一维
              for (int[] arr : arrs) {
                  //遍历的是一维数组  拿到是元素  值
                  for (int i : arr) {
                      if(maxNum < i){
                          maxNum = i;
                      }
      
                      if(minNum > i){
                          minNum = i;
                      }
                  }
              }
      
              System.out.println(maxNum);
              System.out.println(minNum);
      
          }
      }
      
  • 杨辉三角(了解)

    • package com.atguigu.a_two;
      /*
      *  了解:
      * 杨辉三角:练习二维数组的动态初始化  因为是个不规则数组。  每行的列数是不一样的
      *        练习 每行的每列的值  由上一行的列计算而来。  嵌套循环  外层和内层的关系
      * */
      public class YhTest8 {
          public static void main(String[] args) {
              //1.需要创建一个二维数组
              int[][] yh = new int[10][];
      
              //2.动态的分配一维数组的列数
              for (int h = 0; h < yh.length; h++) {
                  //列数随着行数的增长而增长
                  yh[h] = new int[h + 1];
      
                  //每行的第一列都是1
                  yh[h][0] = 1;
                  //每行的最后一列都是1
                  yh[h][h] = 1;
              }
      
              //从第三行的第二列开始,每一列的值 = 上一列的同下标 + 前一个下标的值
              //外层循环控制的是行数, 从第三行开始计算
              for (int h = 2; h < yh.length; h++) {
                  //内存循环控制的是列数。 从第二列开始。 到最后一列-1的下标
                  for (int l = 1; l < yh[h].length - 1; l++) {
                      //当前行的第二列 = 上一行的同列  + 上一行的前一列
                      yh[h][l] = yh[h - 1][l] + yh[h - 1][l - 1];
                  }
              }
      
      
              //最终步骤:打印显示
              for (int i = 0; i < yh.length; i++) {
                  for (int j = 0; j < yh[i].length; j++) {
                      System.out.print(yh[i][j] + "\t");
                  }
                  System.out.println();
              }
          }
      }
      
      

5.6 二维数组的内存图和案例

package com.atguigu.a_two;

public class TwoArrayMemoryTest7 {
    public static void main(String[] args) {
        //在栈中开辟一个空间叫arr。
        //在堆中开辟一个空间存储的是数组元素.
        //将堆中数组的地址,赋值给栈中的arr
        int[] arr = {4,3,5,2,1};

        int[][] arr2 = new int[3][];
        arr2[0] = new int[3];
        System.out.println("arr2[0][0] = " + arr2[0][0]);
        System.out.println("arr2[1] = " + arr2[1]);//二维数组中的一维数组没分配空间时,是null


        arr2[1] = new int[2];

        arr2[2] = arr;

    }
}

package com.atguigu.a_two;

public class TwoArrayMemoryTest7 {
    public static void main(String[] args) {
        //在栈中开辟一个空间叫arr。
        //在堆中开辟一个空间存储的是数组元素.
        //将堆中数组的地址,赋值给栈中的arr
        int[] arr = {4,3,5,2,1};

        int[][] arr2 = new int[3][];
        arr2[0] = new int[3];
        System.out.println("arr2[0][0] = " + arr2[0][0]);
        System.out.println("arr2[1] = " + arr2[1]);//二维数组中的一维数组没分配空间时,是null


        arr2[1] = new int[2];

        arr2[2] = arr;

    }
}
package com.atguigu.a_two;

public class TwoArrayMemoryTest7 {
    public static void main(String[] args) {
        //在栈中开辟一个空间叫arr。
        //在堆中开辟一个空间存储的是数组元素.
        //将堆中数组的地址,赋值给栈中的arr
        int[] arr = {4,3,5,2,1};

        int[][] arr2 = new int[3][];
        arr2[0] = new int[3];
        System.out.println("arr2[0][0] = " + arr2[0][0]);
        System.out.println("arr2[1] = " + arr2[1]);//二维数组中的一维数组没分配空间时,是null


        arr2[1] = new int[2];

        arr2[2] = arr;

    }
}
package com.atguigu.a_two;

public class TwoArrayMemoryTest7 {
    public static void main(String[] args) {
        //在栈中开辟一个空间叫arr。
        //在堆中开辟一个空间存储的是数组元素.
        //将堆中数组的地址,赋值给栈中的arr
        int[] arr = {4,3,5,2,1};

        int[][] arr2 = new int[3][];
        arr2[0] = new int[3];
        System.out.println("arr2[0][0] = " + arr2[0][0]);
        System.out.println("arr2[1] = " + arr2[1]);//二维数组中的一维数组没分配空间时,是null


        arr2[1] = new int[2];

        arr2[2] = arr;

    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值