数组和数组工具类

什么是数组

数组是具有相同数据类型且按一定次序排列的一组变量的集合体。即用一个变量名表示一批数据。Java为数组在内存中分配一段连续的空间,且存储数据的个数是固定的。

数组名称

指向到数组元素的变量就是数组名称

数组元素

构成数组的每一个数据称为数组元素

数组下标(索引)

数组元素在数组中的位置(从0开始,依次加1)

数组下标越界

不再有效范围内的下标(有效范围>=0 并且 <length)

数组大小

元素个数叫做数组的大小,也叫数组的长度(length可以查)

使用步骤

  1. 定义数组名称
  2. 给数组元素分配内存
  3. 元素初始化
  4. 使用数组

提示

  1. 数组是引用类型
  2. 内存地址编号是由JVM分配的,通常用十六进制表示。

使用

定义

定义数组有两种语法格式:

方法一:
数据类型 数组名[];
方法二:
数据类型[] 数组名;

定义数组本质上就是向JVM申请内存,JVM将内存划分为几个区域。其中包含了堆和栈。不同的区域存储不同类别的数据。定义数组时,JVM将数组的名称存储在栈中,栈是一个先进后出的数据结构,因此数据名称在栈底。

分配

语法格式

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

定义数组和分配内存可以合并在一起写

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

声明一个数组时指定了数组名称和元素的类型,并未指定数组元素的个数,也没有为数组元素分配内存,由于没有为数组元素分配内存,所以无法使用数组存储数据。

要让系统改为数组元素分配存储空间,必须之处数组元素的个数,并通过new运算符为数组元素分配内存空间。

初始化

数组声明并为数据元素分配空间完成后,必须为数组元素初始化,才能使用数组元素。

数组元素类型默认初始值
byte,short,int,long0
float,double0.0
char'\u0000'(空字符)
booleanfalse
引用数据类型null

tips:增强for循环遍历数组

注意:for each只能i从天到位遍历无法选择顺序或者某一单一变量

所以在使用 foreach 循环迭代数组元素时,并不能改变数组元素的值,因此不要对 foreach 的循环变量进行赋值。

语法规则

for(元素类型 变量名:要迭代的对象){
    ~~~~
}
//例如

        int[] numbers = {45,65,21,31,12};
        System.out.println("利用for——each语句打印数组的内容");
    // for-each语句
        for (int abc : numbers) {
          abc=58;
            System.out.println("数组中的内容为" + abc);
        }
        System.out.println(numbers[0]);

也就是说for each无法进行单一变量的赋值

image-20230810224921499

一维数组和多维数组

一维数组只有一个维度,而多维数组有多个维度。在实际应用中,多维数组中使用最多的是二维数组。

一维数组的下标只能对应一个元素,而二维即多维数组,可用矩阵来表示,他们都是两个或多个下标值对应一个元素,是多对一的关系,因此是非线性结构。

一维数组的定义:

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

多维数组的定义:

  • 二维数组:

    数组元素的值还是一个数组,也就是一维数组的一维数组

数据类型[][] 数组名 = new 数据类型[行数][列数];
  • 三维数组:
数据类型[][][] 数组名 = new 数据类型[行数][列数][层数];
  • 不规则数组

    不规则数组是每一行的列数不一样的数组

使用

package com.kfm.base.array2;

public class Demo13 {

    public static void main(String[] args) {
        /*
         多维数组: 多个维度
         一维数组   int[] arr = new int[5]

            多维数组可以理解为 数组中每个元素又是一个数组。
           二维数组; 一维数组中每个元素都是数组 [大多数多维数组都是停留在二维],二维可以看作表格的行和列

           三维数组: 二维数组中每个元素都是数组
                ...
          二维数组:
          int[][] arr = new int[长度][];

          new int[3][]; 说明一维数组中有三个一维数组元素
          eg: {{1, 2}, {3, 4}, {5, 6}}
        {
          {1,  2},  // 第一个元素
          {3,  4}, // 第二个元素
          {5,  6}, // 第三个元素
        }


         */
//        int[][] arr = {{}, {}, {}};
//        int[][] arr = new int[][]{}; // 二维数组

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

        /*
            0 1 2
            1 2 3
         */
        arr[1][1] = 6;

//        System.out.println(arr.length); //

        // 遍历输出
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + "\t");
            }
            System.out.println();
        }

    }
}

应用实例

package com.kfm.base.array2;

public class Demo15 {

    public static void main(String[] args) {
        /*
            多维数组排序
               每个同学有三门课的成绩分别是数组的 1 2 3 个元素
              一个班有 5 个同学,按他们的总成绩输出每个同学的各科成绩

              92 96 99
              94 90 87

         */

        int[][] scores = {
                {78, 89, 93}, // 260
                {88, 92, 89}, // 269
                {79, 87, 88}, // 254
                {92, 96, 99}, // 287
                {94, 90, 87}  // 271
        };

        // 对成绩进行排序
        // 将每位同学成绩的和放到新数组中
        int[] sumArr = new int[scores.length];

        for (int i = 0; i < scores.length; i++) {
            int sum = 0;
            for (int j = 0; j < scores[i].length; j++) {
                sum += scores[i][j];
            }
            sumArr[i] = sum;
        }

        // 对总分数组排序
        for (int i = 0; i < sumArr.length - 1; i++) {
            for (int j = 0; j < sumArr.length - 1 - i; j++) {
                if (sumArr[j] < sumArr[j + 1]){
                    // 换总分顺序
                    int temp = sumArr[j];
                    sumArr[j] = sumArr[j + 1];
                    sumArr[j + 1] = temp;
                    // 换各科的顺序
                    int[] score = scores[j];
                    scores[j] = scores[j + 1];
                    scores[j + 1] = score;
                }
            }
        }

//        System.out.println(Arrays.toString(sumArr));


        // 遍历输出
        for (int i = 0; i < scores.length; i++) {
            for (int j = 0; j < scores[i].length; j++) {
                System.out.print(scores[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

数组的内存结构

堆和栈

  1. JVM内存分成几个区域,其中有两个区域分别叫做
  2. 数组元素分配在堆中,数组名称分配在栈中

内存结构示例:

image-20230810143457375

数组工具类(Arrays类

常用方法

方法返回类型说明
equals(array1,array2)boolean比较两个数组是否相等
sort(array)void对数组array的元素进行排序
toString(array)String将一个数组array转换成一个字符串
fill(array,val)void把数组array的所有元素都赋值为val
copyOf(array,length)array数据类型一致把数组array赋值成一个长度为length的新数组
binarySearch(array,val)int查询元素值val在数组array中的下标
compare(array1,array2)int按字典顺序比较数组,前面的数组大,返回大于0的值。反之返回小于0的值
copyOfRange(arr,start,end)array数据类型一致将指定数组的指定范围复制到新数组中
fill(arr,start,end,val)void将指定的值分配给指定数组的指定范围的每个元素
mismatch(array1,array2)int查找并返回两个数组之间第一个不匹配的索引,否则如果未找到不匹配,则返回-1
mismatch(array1,,start1,end1,array2,start2,end2)int查找并返回指定范围内两个数组之间第一个不匹配的相对索引,否则如果未找到不匹配,则返回-1