Java(六)

知识点1:二维数组的使用

 *  数组,属于引用数据类型。
 *  数组的元素,可以是基本数据类型,或引用数据类型。
 *  > 数组A的元素,还可以是数组B。则构成了二维数组
 
 
 对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组。

public class ArrayTest {
    public static void main(String[] args) {
        //  1. 二维数组的声明和初始化

        //静态初始化
        int[][] arr = new int[][]{{1,2,3},{4,5},{6,7,8},{9,8,6,4}};
        String[][] arr1 = new String[][]{{"陈伟霆","刘诗诗"},{"周笔畅","鹿晗","张艺兴"}};

//    int[][][] arr2 = new int[][][]{{{1,2,3},{3,4},{4,5}},{{3,4},{4,5,6,6}}};
        //动态初始化1
        int[][] arr3 = new int[4][3];
        //动态初始化2
        int[][] arr4 = new int[3][];

        //也是正确的格式:
        int arr5[] = new int[5];
        int arr6[][] = new int[5][7];
        int[] arr7[] = new int[5][7];

        //错误的:
//        int[][] arr8 = new int[][5];
//        int[][] arr9 = new int[5][7]{{1,2,3},{4,5},{6,7,8},{9,8,6,4}};

        // 2. 二维数组元素的调用:通过角标的方式
        System.out.println(arr[0][0]);
        System.out.println(arr[3][3]);
        System.out.println(arr1[1][1]);
        arr3[1][2] = 10;

//        arr4[0][0] = 10;//报空指针的异常

        // 3. 二维数组的长度
        System.out.println(arr3.length);//4
        System.out.println(arr3[0].length);//3
        System.out.println(arr1.length);//2
        System.out.println(arr1[1].length);//3
        System.out.println(arr4.length);//3
//        System.out.println(arr4[0].length);//报NullPointerException的错误
        // 4. 二维数组的遍历
        for(int i = 0;i < arr1.length;i++){
            for(int j = 0;j < arr1[i].length;j++){
                System.out.print(arr1[i][j] + "\t");

            }
            System.out.println();

        }


    }

}
  • 数组元素的默认值
package com.atguigu.java;

/**
 *
 * 测试二维数组的使用
 *   5. 二维数组元素的默认初始化值 (以动态初始化为例)
 *      动态初始化方式1:比如:int[][] arr1 = new int[4][3];
 *          外层元素的值:存储代表的一维数组的内存地址值。
 *          内层元素的值:
 *              整型数组,元素的默认初始化值为:0
 *              浮点型数组,元素的默认初始化值为:0.0
 *              字符型数组,元素的默认初始化值为:0
 *              boolean型数组,元素的默认初始化值为:false
 *              引用数组类型数组,元素的默认初始化值为:null
 *
 *      动态初始化方式2:比如:int[][] arr2 = new int[3][];
 *          外层元素的值:null
 *          内层元素的值:根本不存在。如果调用的话,报NullPointerException的错误
 *
 *  对于二维数组来说,约定称谓:
 *   > 外层元素:比如:arr1[0],arr1[1]
 *   > 内层元素:比如:arr1[0][1],arr[1][0]
 *
 *
 */
public class ArrayTest1 {
    public static void main(String[] args) {
        // 5. 二维数组元素的默认初始化值
        int[][] arr1 = new int[4][3];
        System.out.println(arr1[0]);//[I@1540e19d

        double[][] arr2 = new double[4][3];
        System.out.println(arr2[0]);//[D@677327b6


        System.out.println(arr1[0][0]);//0
        System.out.println(arr2[0][0]);//0.0

        System.out.println("######################");
        int[][] arr3 = new int[4][];
        System.out.println(arr3[0]);
        System.out.println(arr3[0][0]);//NullPointerException
        System.out.println("######################");
        arr3[0] = new int[4];
        arr3[1] = new int[]{1,2,3};
        arr3[2] = new int[5];
        arr3[3] = new int[6];

        String[][] classes = new String[4][];
        classes[0] = new String[40];
        classes[1] = new String[50];
    }
}

  • 二维数组的内存解析

在这里插入图片描述

说明:其他内存解析的图,见ppt

知识点2:数组中的常见算法

1. 数组元素的赋值

  • 杨辉三角
package com.atguigu.exer;

import java.util.concurrent.ForkJoinPool;

/**
 *
 * 使用二维数组打印一个 10 行杨辉三角。
 *
 * 【提示】
 *  1. 第一行有 1 个元素, 第 n 行有 n 个元素
 *  2. 每一行的第一个元素和最后一个元素都是 1
 *  3. 从第三行开始, 对于非第一个元素和最后一个元素的元素。即:
 * yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
 */
public class ArrayDemo {
    public static void main(String[] args) {
        //1.二维数组的动态初始化
        int[][] yangHui = new int[10][];

        //2.二维数组的外层元素的动态初始化
        for(int i = 0;i < yangHui.length;i++){
            yangHui[i] = new int[i + 1];
        }

        //3. 给二维数组的内层元素赋值
        for(int i = 0;i < yangHui.length;i++){
            //3.1 每一行的首末元素赋值为1
            yangHui[i][0] = yangHui[i][i] = 1;
            //3.2 每一行的非首末元素赋值。规律为:yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
            //if(i >= 2){
                for(int j = 1;j < yangHui[i].length - 1;j++){
                    yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];
                }
            //}

        }

        //4. 遍历二维数组
        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();
        }
    }
}

  • 回形数(略)
  • 附随机数问题
创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,且是随机赋值。同时,要求元素的值各不相同。  Math.random()

2. 数值型数组的特征值的计算

package com.atguigu.homework;

/**
 *
 * 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
 * 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
 * 要求:所有随机数都是两位数。
 *
 * 提示:如何获取指定范围的随机数:[10,99]
 *  (int)(Math.random() * 90 + 10)
 *
 *  {34,43,65,35,67,45,76,87}
 */
public class HomeWork01 {

    public static void main(String[] args) {
        //1.创建int[]数组,并初始化数组元素
        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] + " ");
        }
        System.out.println();
        //2. 求特征值:最大值、最小值、总和、平均数
        //最大值:
        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 sum = 0;

        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        System.out.println("总和为:" + sum);

        //平均数
        double avg = (double)sum / arr.length;
        System.out.println("平均数为:" + avg);
    }
}

3. 数组的复制、反转、查找(或搜索)

package com.atguigu.java;

/**
 *
 * 测试:数组的复制、反转、查找(线性查找、二分法查找)
 */
public class ArrayTest2 {
    public static void main(String[] args) {
        //1. 复制操作
        int[] arr1 = new int[]{3,4,5,3,6,23,6,84,4};

        int[] arr2 = new int[arr1.length];
        for (int i = 0; i < arr2.length; i++) {
            arr2[i] = arr1[i];
        }

        //2. 反转操作
        //方式1:
//        for(int i = 0;i < arr1.length / 2;i++){
//            int temp = arr1[i];
//            arr1[i] = arr1[arr1.length - 1 - i];
//            arr1[arr1.length - 1 - i] = temp;
//        }
        //方式2:
        for(int x = 0,y = arr1.length - 1;x < y;x++,y--){
            int temp = arr1[x];
            arr1[x] = arr1[y];
            arr1[y] = temp;
        }

        //遍历操作
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr1[i] + "  ");
        }
        System.out.println();

        //3. 查找之线性查找
        int[] arr3 = new int[]{3,14,5,13,6,23,16,84,4};
        int target = 166;
//        boolean isFlag = false;
        int i = 0;
        for(;i < arr3.length;i++){
            if(target == arr3[i]){
                System.out.println("在索引为" + i + "的位置找打了指定的元素");
//                isFlag = true;
                break;
            }
        }
        if(i == arr3.length){
            System.out.println("不好意思,没有找到指定的元素");
        }
//        if(!isFlag){
//            System.out.println("不好意思,没有找到指定的元素");
//        }

        //4. 查找之二分法查找
        //二分法查找:要求此数组必须是有序的。
        int[] arr4 = new int[]{-99,-54,-2,0,2,33,43,256,999};
        boolean isFlag = true;
        int number = 256;
        number = 333;
        int head = 0;//首索引位置
        int end = arr4.length - 1;//尾索引位置
        while(head <= end){
            int middle = (head + end) / 2;
            if(arr4[middle] == number){
                System.out.println("找到指定的元素,索引为:" + middle);
                isFlag = false;
                break;
            }else if(arr4[middle] > number){
                end = middle - 1;
            }else{//arr4[middle] < number
                head = middle + 1;
            }
        }

        if(isFlag){
            System.out.println("未找到指定的元素");
        }

    }
}

  • 练习1
package com.atguigu.exer;

/**
 *
 * 使用简单数组
 * (1)创建一个名为ArrayDemo1的类,在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。
 *
 * 思考:array1和array2是什么关系?
 * 拓展:修改题目,实现array2对array1数组的复制   见【ArrayDemo2.java】
 */
public class ArrayDemo1 {
    public static void main(String[] args) {
        int[] array1,array2;

        array1 = new int[]{2,3,5,7,11,13,17,19};

        //显示array1的内容
        System.out.println("显示array1的内容:");
        for (int i = 0; i < array1.length; i++) {
            System.out.print(array1[i] + "  ");
        }
        System.out.println();

        //赋值array2变量等于array1
        //此操作不能称为数组的复制。
        array2 = array1;

        //修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)
        for(int i = 0;i < array2.length;i++){
            if(i % 2 == 0){
                array2[i] = i;
            }
        }
        //打印出array1
        System.out.println("显示array1的内容:");
        for (int i = 0; i < array1.length; i++) {
            System.out.print(array1[i] + "  ");
        }
        System.out.println();


    }
}

对应的图示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lpmS6rVs-1625668172940)(assets/1595925751381.png)]

  • 练习2:
package com.atguigu.exer;

/**
 *
 * 使用简单数组
 * (1)创建一个名为ArrayDemo1的类,在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。
 *
 * 思考:array1和array2是什么关系?
 * 拓展:修改题目,实现array2对array1数组的复制
 */
public class ArrayDemo2 {
    public static void main(String[] args) {
        int[] array1,array2;

        array1 = new int[]{2,3,5,7,11,13,17,19};

        //显示array1的内容
        System.out.println("显示array1的内容:");
        for (int i = 0; i < array1.length; i++) {
            System.out.print(array1[i] + "  ");
        }
        System.out.println();

        //复制array1
        array2 = new int[array1.length];
        for(int i = 0;i < array2.length;i++){
            array2[i] = array1[i];
        }

        //修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)
        for(int i = 0;i < array2.length;i++){
            if(i % 2 == 0){
                array2[i] = i;
            }
        }
        //打印出array1
        System.out.println("显示array1的内容:");
        for (int i = 0; i < array1.length; i++) {
            System.out.print(array1[i] + "  ");
        }
        System.out.println();


    }
}

对应的图示

在这里插入图片描述

4. 数组的排序

  • 排序的概念
排序:假设含有n个记录的序列为{R1,R2,...,Rn},其相应的关键字序列为{K1,K2,...,Kn}。将这些记录重新排序为{Ri1,Ri2,...,Rin},使得相应的关键字值满足条Ki1<=Ki2<=...<=Kin,这样的一种操作称为排序。
通常来说,排序的目的是快速查找。

  • 排序算法的衡量标准
1.时间复杂度:分析关键字的比较次数和记录的移动次数
2.空间复杂度:分析排序算法中需要多少辅助内存
3.稳定性:若两个记录AB的关键字值相等,但排序后AB的先后次序保持不变,则称这种排序算法是稳定的。

  • 常见的十大排序算法

在这里插入图片描述

红色:重要的 (建议:会手写)

黄色:次重要的 (明白排序思想)

  • 冒泡排序
package com.atguigu.java;


/**测试冒泡排序
 */

public class ArrayTest3 {
    public static void main(String[] args) {
        int[] arr1 = new int[]{3,14,5,13,6,23,16,84,4};

        for(int i = 0;i < arr1.length - 1;i++){

            for(int j = 0;j < arr1.length - 1 - i;j++){

                if(arr1[j] > arr1[j + 1]){
                    int temp = arr1[j];
                    arr1[j] = arr1[j + 1];
                    arr1[j + 1] = temp;

                }
            }
        }

        //遍历
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr1[i] + " ");
        }
    }
}

  • 快速排序

在这里插入图片描述

知识点3:Arrays工具类的使用

  • Arrays是操作数组的工具类
  • 熟悉常用的方法

在这里插入图片描述

  • 代码演示
package com.atguigu.java1;

import java.util.Arrays;

/**
 * Arrays:操作数组的工具类。
 *
 */
public class ArraysTest {
    public static void main(String[] args) {
        int[] arr1 = new int[]{1,2,3,4,5};
        int[] arr2 = new int[]{1,2,4,3,5};
        System.out.println(arr1 == arr2);
        //1. equals()
        System.out.println(Arrays.equals(arr1,arr2));
        //2. toString()
        System.out.println(arr1);
        System.out.println(Arrays.toString(arr1));

        //3. fill()
        Arrays.fill(arr1,10);
        System.out.println(Arrays.toString(arr1));

        //4. sort()
        int[] arr3 = new int[]{3,14,5,13,6,23,16,84,4};
        Arrays.sort(arr3);
        System.out.println(Arrays.toString(arr3));

        //5.binarySearch()
        //前提:数组必须有序
        int index = Arrays.binarySearch(arr3, 23);
        if(index >= 0){
            System.out.println("找到了指定元素,位置为:" + index);
        }else{
            System.out.println("未找到");
        }

    }
}

知识点4:数组中的常见异常

package com.atguigu.java1;

/**
 * 测试数组中的常见异常
 */
public class ArrayExceptionTest {
    public static void main(String[] args) {
        //1. 数组角标越界异常:ArrayIndexOutOfBoundsException
        int[] arr = new int[10];//0-9
        System.out.println(arr[9]);
//        System.out.println(arr[10]);//越界
//        System.out.println(arr[-10]);//越界

        //2. 空指针异常:NullPointerException
        //情况1:
//        int[] arr1 = new int[10];
//        arr1 = null;
//        System.out.println(arr1[0]);

        //情况2:
//        int[][] arr2 = new int[5][];
//        System.out.println(arr2[0][0]);


        //情况3:
        String[] arr3 = new String[5];
        System.out.println(arr3[0].toString());
    }
}

知识点5:了解面向对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值