Java数组

94 阅读3分钟

1. 数组

1.1.数组使用

1.1.1 声明数组
    private static void method1() {
        int num;
        //引用类型 声明数组
        int[] scores1;// (常用)
        int scores2[];
    }
1.1.2 初始化
/*
     * 三种初始化方式
*/
    private static void method2() {
        int[] scores;
        //1,第一种初始化方式,scores数组中只能存放3个值数组长度(容量大小)
        scores = new int[3];
        //2,第2种初始化方式  {}
        int[] scores2 = {95, 12, 546, 768, 346};
        //3,第3种初始化方式
        int[] scores3 = new int[]{12, 234};
        //
        double[] arr1 = {12.3, 234.6};
        //任意数据类型[]
        String[] arr2 = {"23", "56", "77"};
    }
1.1.3 数组元素和存值和取值
  • 数组的索引值从0开始
  • 索引的有效取值范围 [0, length-1]
    private static void method3() {
        //arr1 可以称之为数组名
        int[] arr1 = {23, 67, 99, 100};
        //取数组元素值 索引值从0开始; 取数组名[索引值]
        System.out.println(arr1[3]);
        //ArrayIndexOutOfBoundsException数组索引越界 索引的有效取值范围 [0, length-1]
        //  System.out.println(arr1[1]);
        //赋值
        arr1[1] = 88;
        System.out.println(arr1[1]);
        //toString()方法   把数组转换位字符串形式并返回
        System.out.println(Arrays.toString(arr1));
    }
1.1.4 数组元素的默认值
  • 数组的第一种初始化方式,JVM给每个数据元素赋值了。为其数据类型的零值,int零值为0,double的零值为0.0,而所有引用类型的零值是null。
    private static void method5() {
        //其数据类型的零值, 所有引用类型的零值是null
        int[] arr1 = new int[3];
        double[] arr2 = new double[6];
        boolean[] arr3 = new boolean[5];
       
        String[] arr4 = new String[5];
        
        System.out.println(arr1[0]);
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        System.out.println(Arrays.toString(arr3));
        System.out.println(Arrays.toString(arr4));
    }
练习题
/*
     * 练习题:动态录入班级人数和学员成绩,计算班级学员的平均成绩
*/
    private static void method4() {
        Scanner input = new Scanner(System.in);
        System.out.println("请录入班级学员人数:");
        int stuNum = input.nextInt(); //10
        //初始化数组
        int[] scores = new int[stuNum]; // 10
        // 重复执行
        int sum = 0;
        for (int i = 0; i < stuNum; i++) {
            //录入学员成绩
            System.out.println("请录入第 " + (i + 1) + " 个学生的成绩");
            int score = input.nextInt();
            //给数组元素赋值
            scores[i] = score;
            //成绩累加
            sum += score;
        }
        System.out.println("sum : " + sum);
        System.out.println("avg: " + (sum / stuNum));
    }
1.1.5 最值所在的索引值
    private static void method5() {
        int[] arr1 = {45, 67, 89, 10, 100, 20};
        // 数组长度
        System.out.println(arr1.length);
        //求最值 所在的索引
        int maxIndex = 0;
        int minIndex = 0;
        for (int i = 1; i < arr1.length; i++) {
            maxIndex = arr1[maxIndex] > arr1[i] ? maxIndex : i;
            minIndex = arr1[minIndex] < arr1[i] ? minIndex : i;
        }
        System.out.println("maxIndex: " + maxIndex);
        System.out.println("max: " + arr1[maxIndex]);
        System.out.println("min: " + arr1[minIndex]);
        System.out.println("minIndex: " + minIndex);
    }
1.1.6 对数组遍历

增强for循环

    private static void method6() {
        int[] arr1 = {45, 67, 89, 10, 100, 20};
        //遍历
        //1,普通for循环遍历
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
        System.out.println("==========");
        //2,增强for循环
        for (int item : arr1) {
            System.out.println(item);
        }
        //
        String[] arr2 = {"abc", "java", "hello"};
        for (String a : arr2) {
            System.out.println(a);
        }
    }
1.1.7 数组的拷贝
  • 引用赋值
private static void method7() {
        int[] arr1 = {34, 55, 10};
        //引用赋值
        int[] arr2 = arr1;
        System.out.println(Arrays.toString(arr2));
        arr1[0] = 1;
        System.out.println(Arrays.toString(arr2));
    }
  • 数组元素拷贝
/*
         new
*/
    private static void method8() {
        int[] arr1 = {34, 55, 10};
        // 方式new出来的对象都在堆空间
        int[] arr2 = new int[arr1.length];
        for (int i = 0; i < arr1.length; i++) {
            arr2[i] = arr1[i];
        }
        System.out.println(Arrays.toString(arr2));
        arr1[0] = 1;
        System.out.println(Arrays.toString(arr2));
    }
  • 借助Arrays工具类 Arrays.toString()

1.2.Arrays工具类

1.2.1 常用方法
  • Arrays.toString 元素以字符串形式返回。
  • Arrays.copyOf(arr1, arr1.length)。数组拷贝,第一个参数是源头数组,第二个参数是新数组的长度。
  • Arrays.equals(arr1, arr2),两数组比较。
  • Arrays.sort(arr1),对数组排序 升序。
    private static void method9() {
        // Arrays工具类
        int[] arr1 = {23, 12, 66, 9, 1};
        //Arrays.toString 元素以字符串形式返回
        System.out.println(Arrays.toString(arr1));
        //数组拷贝 ,第一个参数是源头数组,第二个参数是 新数组的长度
        int[] arr2 = Arrays.copyOf(arr1, arr1.length);
        System.out.println(Arrays.toString(arr2));
        // 两个数组元素值一一相等
        boolean b = Arrays.equals(arr1, arr2);
        System.out.println(b);
        //对数组排序 升序
        Arrays.sort(arr1);
        System.out.println(Arrays.toString(arr1));
    }
练习

数组的动态扩容

public static void main(String[] args) {
        //动态 扩容
        Scanner scanner = new Scanner(System.in);
        String[] names = new String[3];
        int index = 0;
        String answer = "";
        do {
            if (index >= names.length) {
                //容量不足了 ,需要扩容
                System.out.println("容量不足了 ,正在扩容");
                // 对names重新赋值,names指向新的数组,进行扩容
                names = Arrays.copyOf(names, names.length * 2);
            }
            System.out.println("请录入 第" + (index + 1) + "个学生姓名: ");
            names[index] = scanner.next();
            index++;
        } while (answer.equals("y"));
        System.out.println(Arrays.toString(names));
    }

1.3 二维数组

  • 二维数组的数组元素是一维数组
  • 二维数组也是引用类型
1.3.1 二维数组的初始化
    private static void method1() {
        int[][] arr = new int[3][];
        //只要出现new都是在堆新开辟空间;
        arr[0] = new int[3];
        arr[1] = new int[5];
        arr[2] = new int[9];
        System.out.println(Arrays.toString(arr));
        // 2种初始化方式 每个一维数组长度一样
        int[][] arr2 = new int[3][2];
      /*  arr2[0] = new int[2];
        arr2[1] = new int[2];
        arr2[2] = new int[2];*/
        System.out.println(Arrays.toString(arr2));
        // 3种 直接赋值
        int[][] arr3 = {{23, 234, 12}, {1, 2, 3, 4}};
    }
1.3.2 二维数组的元素存和取
  • 空指针报错 不能对null进行任何成员的调用
    private static void method2() {
        int[][] arr = new int[3][]; //null,null,null
        System.out.println(arr.length);
        // null.
        //只要出现new 都会在堆新开辟空间;
        arr[0] = new int[3];
        System.out.println(arr[0].length);
        // 取
        System.out.println(arr[0][0]);
        //赋值
        arr[0][0] = 19;
        System.out.println(arr[0][0]);
    }
练习
/*
    动态录入班级数,以及每个班级学生的人数,以及每个学生的成绩
     * [23,1234,14,12]
     * [12,56]
     * [90]
*/
    private static void method3() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请录入班级个数 ");
        int classNum = scanner.nextInt(); //3
        //
        int[][] scores = new int[3][];
        //
        for (int i = 0; i < scores.length; i++) {
            System.out.println("请录入第" + (i + 1) + "个班的学生人数:");
            int stuNum = scanner.nextInt();
            //给一维数组初始化
            scores[i] = new int[stuNum];
            for (int j = 0; j < scores[i].length; j++) {
                System.out.println("请录入第" + (i + 1) + "个班 第" + (j + 1) + "个学生的成绩:");
                scores[i][j] = scanner.nextInt();
            }
        }
        for (int i = 0; i < scores.length; i++) {
            System.out.println(Arrays.toString(scores[i]));
        }
    }