java系列:数组

82 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

数组

数组

数组介绍:数组可以存放多个同一类型的数据,数组也是一种数据类型,是引用类型,即:数(数据)组(一组)就是一组数据

数组快速入门:Array01.java

public class Array01 {
    public static void main(String[] args) {
        //有六只鸡,它们的体重分别是3,5,1,3.4,2,50kg
        //请问这六只鸡得到总体重是多少?平均体重是多少
//        思路分析
//                1.定义六个变量,double,求和
        //传统实现的方式问题,6->600-566很麻烦
//        double hen1 = 3;
//        double hen2 = 5;
//        double hen3 = 1;
//        double hen4 = 3.4;
//        double hen5 = 2;
//        double hen6 = 50;
​
//        double totalWeight = hen1 + ... +
        //定义一个数组
        //1.double[]表示是double类型的数组,数组名hens
        //2.{3,5,1,3.4,2,50}表示数组的值、元素,一次表示数组的第几个元素
        double[] hens = {3,5,1,3.4,2,50};
//        遍历数组得到数组的元素的和,使用for
        //使用一个变量将各个元素累计
​
        //可以通过 数组名.length 得到数组的大小/长度
​
        double totalWeight = 0;
​
        for (int i = 0; i < 6; i++){
            totalWeight += hens[i];
​
        }
​
        System.out.println("总体重为" + totalWeight + "kg");
        System.out.println("平均体重为" + totalWeight / 6);
    }
}

有六只鸡,它们的体重分别是3,5,1,3.4,2,50kg,请问这六只鸡得到总体重是多少?平均体重是多少

比如,我们可以用数组解决上一个问题

数组的使用

  • 使用方式一--动态初始化

数组的定义

数据类型 数组名[] = new 数据类型[大小]

int a[] = new int[5];//创建了一个数组,名字a,存放5个int

说明:这是定义数组的一种方法

数组的引用

数组名[下标/索引]比如要使用a数组中的第三个数 a[2];

快速入门案例Array02.java

import java.util.Scanner;
public class Array02 {
    public static void main(String[] args) {
​
        //演示   数据类型 数组名[] = new 数据类型[大小]
        //循环输入5个成绩,保存到double数组,并输出
        Scanner scanner = new Scanner(System.in);
​
//        double scores[] = new double[5];
        double scores[];  //声明数组,这时scores是null
        scores = new double[5];  //分配内存空间,可以存放数据
​
​
​
        for (int i = 0; i < scores.length; i++){
​
            System.out.println("请输入第" + (i+1) + "个数");
            scores[i] = scanner.nextDouble();
​
​
        }
        for (int i = 0; i < scores.length; i++){
            System.out.println(scores[i]);
        }
​
​
    }
}

循环输入5个成绩,保存到double数组,并输出

  • 使用方式二--动态初始化(先声明数组再分配空间)

先声明数组 //在内存中还没有分配空间

语法:数据类型 数组名[]; 也可以 数据类型[] 数组名;

int a[];
int[] a;

创建数组

语法:数组名 = new 数据类型[大小]; //此时才进行分配空间

a = new int[10];

案例演示:

前面的修改即可

  • 使用方式三--静态初始化

初始化数组

语法:数组类型 数组名[] = {元素值,元素值,……}

int a[] = {2,5,6,7,8,89,90,34,56};
//如果知道数组有多少元素,具体值,上面的用法相当于
int a[] = new int[9];
a[0] = 2;………………

快速入门案例【养鸡场】

Array01.java

使用细节

  1. 数组就是多个相同类型数据的组合,实现对这些数据的统一管理

  2. 数组中的元素可以是任何类型的数据,包括基本类型和引用类型,但是不能混用

  3. 数组创建后,如果没有赋值,有默认值

    int 0;
    short 0;
    byte 0;
    long 0;
    float 0.0f;
    double 0.0;
    char \u0000;
    boolean false;
    String null;
    
  4. 使用数组的步骤

    1. 声明数组并开辟空间
    2. 给数组各个元素赋值
    3. 使用数组
  5. 数组的下标是从零开始的

  6. 数组下标必须在指定范围内使用,否则报:下标越界异常,比如:

    int [] arr = new int[5];//有效下标是0-4
    
  7. 数组属于引用类型,数组型数据是对象(object)

数组应用案例

  1. 创建一个char类型的26个元素的数组,分别放置'A'-'Z'使for循环访问所有元素并打印出来:ArrarExercise01.java

    public class ArrarExercise01 {
        public static void main(String[] args) {
    //        创建一个char类型的26个元素的数组
    //        分别放置'A'-'Z'使for循环访问所有元素并打印出来
            char array[];//声明数组
            array = new char[26];
            char c = 'A';
            for (int i = 0; i < array.length; i++){
                array[i] = c;
                c++;
            }
    ​
            for (int j = 0; j < array.length; j++){
                System.out.println(array[j]);
            }
    ​
        }
    }
    ​
    
  2. 请求出一个数组int[]的最大值{4,-1,9,10,23}并得到对应的下标ArrarExercise02.java

    public class ArrarExercise02 {
        public static void main(String[] args) {
    ​
            //请求出一个数组int[]的最大值{4,-1,9,10,23}并得到对应的下标
    //        int num[];
    //        num = new int[1];
            int[] num = {4,-1,9,10,23};
            int max = num[0];
            int xiabiao = 0;
    ​
    ​
            for (int i = 0; i < num.length; i++) {
                if (max < num[i]) {
                    max = num[i];
                    xiabiao = i;
                }
            }
            System.out.println(max);
            System.out.println(xiabiao);
    ​
    ​
    ​
        }
    }
    ​
    
  3. 请求出一个数组的和和平均值

数组赋值机制

  1. 基本数据类型赋值,这个值就是具体的数据,而且相互不影响

    int n1 = 2;
    int n2 = n1;
    
  2. 数组在默认情况下是引用传递,赋的值是地址,看一个案例(重点)ArrayAssign.java

    public class ArrayAssign {
        public static void main(String[] args) {
            //基本数据类型赋值,赋值方式为值拷贝
            //n2的变化,不会影响n1的值
    //        int n1 = 10;
    //        int n2 = n1;
    //
    //        n2 = 80;
    //        System.out.println("n1 = " + n1);
    //        System.out.println("n2 = " + n2);
    ​
            //数组在默认情况下是引用传递,赋的值是地址,赋值的方式为引用赋值
            //是一个地址,arr2变化会影响到arr1
    ​
            int[] arr1 = {1,2,3};
            int[] arr2 = arr1;
            arr2[0] = 5;
            for (int i = 0; i < arr1.length; i++){
                System.out.println(arr1[i] + " " + arr2[i]);
    ​
            }
    ​
    ​
    ​
        }
    }
    ​
    
    int arr1 = {1,2,3};
    int arr2 = arr1;
    

image-20221027233626586.png

数组拷贝

编写代码实现数组拷贝(内容复制)ArrCopy.java

public class ArrayCopy {
    public static void main(String[] args) {
        //拷贝到arr2数组,要求数据空间是独立的
        int[] arr1 = {10,20,30};
        //先创建一个新的数组,arr2,开辟新的数据空间
        //大小等于arr1.length
        int[] arr2 = new int[arr1.length];
        //遍历arr1,把每个元素拷贝到对应位置
        for (int i = 0; i < arr1.length; i++){
            arr2[i] = arr1[i];
        }
​
​
    }
}

int[] arr1 = {10,20,30};
//拷贝到arr2数组

数组反转

要求把数组的元素内容反转。ArrayReverse.java

public class ArrayReverse {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {11,22,33,44,55,66};
        int[] arr1 = new int[arr.length];
        for (int i = arr.length - 1,j = 0; i >= 0; i--,j++){
            //逆序遍历arr再正着赋给arr1
            arr1[j] = arr[i];
        }
        //把arr指向arr1
        //原本arr的地址指向的内存会被当成垃圾进行销毁
        arr = arr1;
        for (int i = 0; i < arr.length; i++){
            System.out.println(arr[i]);
        }
    }
}
arr{11,22,33,44,55,66}->{66,555,44,33,22,11}

思考:

方式一:通过找规律反转

方式二:通过逆序赋值方式

数组扩容

要求:实现动态的给数组添加元素效果,实现对数组扩容ArrayAdd.java

public class ArrayAdd {
    public static void main(String[] args) {
​
        //定义初始数组int[] arr = {1,2,3}
        //将原数组拷贝到新数组,新数组的长度是arr.length + 1
        int[] arr = {1,2,3};//原数组
        int[] arrNew = new int[arr.length + 1];//新数组
        for (int i = 0; i < arr.length; i++){//将原数组的值赋给新数组
            arrNew[i] = arr[i];
        }
        arrNew[arrNew.length - 1] = 4;//把4赋给新数组的最后一个值
        arr = arrNew;//将原数组指向新数组,原数组内存空间将会被垃圾回收处理
        for (int i = 0; i < arr.length; i++){//遍历arr
            System.out.println(arr[i]);
        }
​
​
​
    }
}

原始数组使用静态分配

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

增加的元素,直接放在数组的最后 arr = {1,2,3,4}

arrNew = {1,2,3,4}

用户可以通过如下方法来决定是否继续添加,添加成功,是否继续y/n

课后练习:ArrReduce.java

import java.util.Scanner;
public class ArrayReduce {
    public static void main(String[] args) {
        //数组缩减
        //有一个数组{1,2,3,4,5}可以将该数组进行缩减,提示用户是否继续缩减,每次缩减最后那个元素,当只剩下最后一个元素时,提示:不能再缩减
        /*
        思路分析
        1.原数组
        2.创建一个新数组,长度为原数组减一,将原数组除了最后一个元素外拷贝到新数组
        3.将原数组指向新数组
        */
​
        Scanner scanner = new Scanner(System.in);
​
​
​
        int[] arr = {1,2,3,4,5};//原数组
​
        do {
​
​
​
        if (arr.length <= 1){
            System.out.println("就剩一个元素啦,不能再缩减了哦");
            break;
        }
        //定义一个新数组,将新数组拷贝到新数组中
        int[] arr2 = new int[arr.length - 1];
​
​
​
        //拷贝
        for (int i = 0; i < arr.length - 1; i++){
            arr2[i] = arr[i];
        }
​
        //指向新数组
        arr = arr2;
​
        for (int i = 0; i < arr.length; i++){
            System.out.println(arr[i]);
        }
​
        System.out.println("请问是否继续缩减 y/n");
​
        char c = scanner.next().charAt(0);
        if (c == 'n'){
            break;
        }
​
​
​
​
        }while(true);
​
​
​
​
    }
}

有一个数组{1,2,3,4,5},可以将该数组进行缩减,提示用户是否继续缩减,每次缩减最后的元素,当只剩下最后一个元素,提示不再缩减