Java基本语法(七):数组

数组的相关概念

        1.概述:数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。

        2.数组的常见概念

                1.数组名

                2.下标(或索引)

                3.元素

                4.数组的长度:(元素的个数)

       3.数组的特点:

                1.数组是有序排列的

               2.组属于引用数据类型的变量。数组的元素既可以是基本数据类型,也可以是引用数据类型

                3.创建数组对象会在内存中开辟一整块连续的空间

                4.数组的长度一旦确定,就不能修改。

        4.数组的分类;

                1.按照维数:一维数组、二维数组 。。。

                2.按照数组元素的类型。基本数据类型元素的数组、引用数据类型元素的数组

        5.一维数组的使用

                1.一维数组的声明和初始化

                        声明:类型[] 变量名;

                        初始化方式一(静态初始化):变量名 =  new 类型[]{元素1,元素2,...};(数组的初始化和数组元素的赋值操作同时进行)

                        初始化方式二(动态初始化): 变量名 =  new 类型[数组长度];(数组的初始化和数组元素的赋值操作分开进行)

                2.如何调用数组的指定位置的元素

                        通过角标的方式调用(从0开始,到长度-1结束)

                3.如何获取数组的长度

                        数组名.length

                4.如何遍历数组

for (int i = 0;i < names.length;i++){
            System.out.println(names[i]);
        }

                5.数组元素的默认初始化值

                        1.基本数据类型:

                                整型数组默认的值:0

                                浮点型数组默认的值:0.0

                                char型数组默认的值:0或'\u0000',而非'0'

                                Boolean型数组默认的值:false

                         2.引用数据类型:数组默认的值:null

                6.数组的内存解析

                        栈:存放局部变量

                        堆:存放 new 的内容

        6.多维数组的使用

                规定:二维数组分为外层数组的元素,内层数组的元素

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

                        外层元素:arr[0], arr[1]等

                        内层元素:arr[0][0] , arr[1][2]等

                1.数组元素的默认初始化值

                        1.针对于初始化方式一:比如:int[][] anr = new int[4][3];

                                外层元素的初始化值为:地址值

                                内层元素的初始化值为:与一维数组初始化情况相同

                        2.针对于初始化方式二:比如:int[][]arr = new int[4][];

                                外层元素的初始化值为:null

                                内层元素的初始化值为:不能调用,否则报错

案例(一维数组)

        /*
        从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
        成绩>=最高分-10  等级为·A,
        成绩>=最高分-20  等级为·B,
        成绩>=最高分-30  等级为’C,
        其余            等级为’D
        提示:先读入学生人数,根据人数创建int数组,存放学生成绩。
        */

        Scanner scan = new Scanner(System.in);

        //获取学生人数
        System.out.println("请输入学生人数: ");
        int studentCount = scan.nextInt();

        //建立数组
        int[] scores = new int[studentCount];

        //将成绩写入数组
        int maxScores = 0;
        System.out.println("请输入" + studentCount  + "个学生成绩: ");
        for (int i = 0;i < scores.length;i++){
            scores[i] = scan.nextInt();
            if (maxScores < scores[i]) {
                maxScores = scores[i];
            }
        }

        //求出最大成绩
        /*int maxScores = 0;
        for (int i = 0;i < scores.length;i++){
            if (maxScores < scores[i]){
                maxScores = scores[i];
            }
        }*/

        //输出结果
        char level;
        for (int i = 0;i < scores.length;i++){
            if (maxScores - scores[i] <= 10){
                level = 'A';
            }else if (maxScores - scores[i] <= 20){
                level = 'B';
            }else if (maxScores - scores[i] <= 30){
                level = 'C';
            }else {
                level = 'D';
            }
            System.out.println("student " + i + " scores is " + scores[i] + ",grade is " + level);
        }

案例(多维数组)

        /*
        使用二维数组打印一个10行杨辉三角。
        【提示】
        1.第一行有1个元素,第n行有n个元素
        2.每一行的第一个元素和最后一个元素都是1
        3.从第三行开始,对于非第一个元素和最后一个元素的元素。即:
        yanghui[i][j]= yanghui[i-1][j-1] + yanghui[i-1][j];
         */

        //1.声明并初始化二维数组
        int[][] yangHui = new int[10][];

        //2.给数组的元素赋值
        for (int i = 0;i < yangHui.length;i++){
            yangHui[i] = new int[i + 1];

            //2.1给首末元素赋值
            yangHui[i][0] = 1;
            yangHui[i][i] = 1;
            //2.2给每行的非首末元素赋值
            if (i > 1){
                for (int j = 1;j < yangHui[i].length - 1;j++){
                    yangHui[i][j]= yangHui[i-1][j-1] + yangHui[i-1][j];
                }
            }

        }

        //3.遍历二维数组
        for (int i = 0;i < yangHui.length;i++){
            for (int j = 0;j < yangHui[i].length;j++){
                System.out.print(yangHui[i][j] + " ");
            }
            System.out.println();
        }

数组中常见的算法

        1.数组元素的赋值(杨辉三角、回形数等)

        2.求数值型数组中元素的最大值、最小值、平均数、总和等

        3.数组的复制、反转、查找(线性查找、二分法查找)

        4.数组元素的排序算法(内部排序(内存)和外部排序(磁盘))

 

案例(求数值型数组中元素的最大值、最小值、平均数、总和等)

        /*
        算法的考查:求数值型数组中元素的最大值、最小值、平均数、总和等
        定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
        然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
        要求:所有随机数都是两位数。
         */
        int[] arr = new int[10];

        for (int i = 0;i < arr.length;i++){
            arr[i] = (int) (Math.random() * 90 + 10);
        }

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

        //求最大值
        int max = arr[0];
        for (int i = 1;i < arr.length;i++){
            if (max < arr[i]){
                max = arr[i];
            }
        }
        System.out.println("最大值为:" + max);

        //求最小值
        int min = arr[0];
        for (int i = 1;i < arr.length;i++){
            if (min > arr[i]){
                min = arr[i];
            }
        }
        System.out.println("最小值为:" + min);

        //求总值
        int number = 0;
        for (int i = 1;i < arr.length;i++){
            number += arr[i];
        }
        System.out.println("总值为:" + number);

        //求平均值
        double avg = number/arr.length;
        System.out.println("平均值为:" + avg);

案例(数组的复制、反转、查找)

     复制

        /*
        使用简单数组
        (1)创建一个名为ArrayTest的类,在main()方法中声明array1和array2两个变量
        他们是int[]类型的数组。
        (2)使用大括号{},把array1初始化为8个素数。2,3,5,7,11,13,17,19。
        (3)显示array1的内容。
        (4)赋值array2变量等于array1,修改array2中的偶索引元素,
        使其等于索引值(如array[0]=0 ,array[2]=2)。打印出array1.
         */
        int[] array1;
        int[] array2;
        array1 = new int[]{2,3,5,7,11,13,19};

        for (int i = 0;i < array1.length;i++){
            System.out.print(array1[i] + "\t");
        }

        System.out.println();

        //数组的复制
        array2 = new int[array1.length];
        for (int i = 0;i < array2.length;i++){
            array2[i] = array1[i];
        }
        for (int i = 0;i < array2.length;i++){
            if(i % 2 == 0){
                array2[i] = i;
            }
        }

        for (int i = 0;i < array1.length;i++){
            System.out.print(array1[i] + "\t");
        }
        System.out.println();
        for (int i = 0;i < array2.length;i++){
            System.out.print(array2[i] + "\t");
        }

     反转

        /*
        反转
         */
        String[] array1 = new String[]{"AA","BB","CC","DD","EE","FF"};

        for (int i = 0;i < array1.length / 2;i++){
            String temp = array1[i];
            array1[i] = array1[array1.length - i - 1];
            array1[array1.length - i - 1] = temp;
        }
        for (int i = 0;i < array1.length;i++){
            System.out.print(array1[i] + "\t");
        }

     查找(线性查找)

        /*
        查找
         */
        String[] array1 = new String[]{"AA","BB","CC","DD","EE","FF"};
        String desc = "CC";
        boolean isFlag = true;
        for (int i = 0;i < array1.length;i++){
            if (desc.equals(array1[i])){
                System.out.println("找到了,位置为:" + i);
                isFlag = false;
                break;
            }
        }
        if (isFlag){
            System.out.println("没有找到!");
        }

     查找(二分法查找(前提:有序))

        int[] array = new int[]{-32,-14,3,26,47,78,89,145,568};

        int desc = 3;
        boolean isFlag = true;
        int head = 0;   //首索引
        int end = array.length -1;  //尾索引

        while (head <= end){
            int middle = (head + end) / 2;
            if(desc == array[middle]){
                System.out.println("找到了,位置为:" + middle);
                isFlag = false;
                break;
            }else if (desc < array[middle]){
                end = middle - 1;
            }else {
                head = middle + 1;
            }
        }
        if (isFlag){
            System.out.println("没有找到!");
        }

案例(数组元素的排序算法)

     冒泡排序

        int[] arr = new int[]{21,12,34,53,66,25,54,85,43};

        //冒泡排序
        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;
                }
            }
        }
        for (int i = 0;i < arr.length;i++){
            System.out.print(arr[i] + "\t");
        }

排序算法性能对比

Arrays工具类

        提供了大量封装好的方法

数组使用中的常见异常 

        1.数组角标越界的异常:ArrayIndexOutOfBoundsExcetion

        2.空指针异常:NullPointerException

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值