【JAVA基础&数组】知识点复盘、整理

【JAVA基础&数组】知识点复盘、整理

写在前面

在实际开发当中我们更多的会使用集合来代替数组,但是集合的底层也是基于数组来实现的,所以花了一些时间对数组的知识点进行了复习巩固,并在此对一些知识点进行记录。

后续在实际开发过程中遇到的关于数组的一些实际案例以及问题的解决方案,也会在此进行记录。

目录

常见的使用案例

0x01:杨辉三角

public static void main(String[] args) {
    //声明数组
    int[][] arr = new int[10][];

    //数组赋值
    for (int i = 0; i < arr.length; i++) {
        arr[i] = new int[i + 1];

        //给行首行末赋值1
        arr[i][0] = arr[i][i] = 1;

        //给非时行首末赋值
        for (int j = 1; j < arr[i].length - 1; j++) {
            //从三行开始,除行首末外的值等于:前一行且前一列的项 + 前一行同一列的项
            arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
        }
    }

    //输出数组
    for (int[] ints : arr) {
        for (int anInt : ints) {
            System.out.print(anInt + "  ");
        }
        System.out.println();
    }
}

输出结果

0x02:二分法查找

public static void main(String[] args) {
    int [] arr = new int[]{11,22,33,44,55,66};
    int target = 55;
    int head = 0;
    int end = arr.length - 1;
    boolean isflag = false;
    while (head <= end){
        int middle = (head + end) / 2;
        if(arr[middle] == target){
            System.out.println("找到了,坐标在 " + middle);
            isflag = true;
            break;
        }else if(arr[middle] > target){
            //当前的middle值比目标大,改变end的值为middle的前一位
            end = middle - 1;
        }else{
            head = middle + 1;
        }
    }
    if(!isflag) System.out.println("未找到");
}

执行结果

常见的排序算法

0x01:冒泡排序

案例代码如下

public static void main(String[] args) {
    int [] arr = new int[]{12,13,-51,11,-99,55,3,133,666};

    //冒泡排序
    for (int i = 0; i < arr.length; i++) {
        //内循环每轮都从数组开始的位置与前一项进行比对
        for (int j = 0; j < arr.length - 1 - i; j++) { //保证每轮内循环排序后比对的数量都减少一位
            if(arr[j] > arr[j + 1]){
                //交换变量的值
                arr[j] = arr[j] + arr[j+1];       // A = A + B
                arr[j + 1] = arr[j] - arr[j + 1];     // B = A = (A+B) - B
                arr[j] = arr[j] - arr[j + 1];      // A = B  = (A+B) - A
            }
        }
    }

    //遍历数组
    for (int item: arr) {
        System.out.print(item + " ");
    }
}

冒泡排序执行过程

0x02:快速排序

排序思路以及案例:

待补充

快速排序的执行过程如下

0xFF:其他算法

暂时只收集动态效果图,具体案例待后续补充

选择排序

插入排序

归并排序

希尔排序

常用的工具类

0x01:Arrays

需求:

1、从键盘输入本组学员的成绩,放到数组中

2、用for循环显示所有学员的成绩

3、排序:从低到高

4、查找是否有正好60分的,如果有返回位置

5、复制成绩最低三名构成新数组

6、用工具类打印成绩最低三名成绩

public static void main(String[] args){
    //1、声明一个数组并创建一个数组
    int[] scores = new int[5];

    //2、从键盘输入成绩
    Scanner input = new Scanner(System.in);
    for(int i=0; i<scores.length; i++){
        //成绩存在数组的元素中
        //为元素赋值
        System.out.print("请输入第" + (i+1) + "个学员的成绩:");
        scores[i] = input.nextInt();
    }

    //3、显示成绩
    //用foreach显示所有学员的成绩
    System.out.println("本组学员的成绩如下:");
    for(int s = 0; s < scores.length;i++){
        System.out.println(scores[s]);
    }
    //4、排序:从低到高
    Arrays.sort(scores);

    System.out.println("排序后的结果:" + Arrays.toString(scores));

    //5、查找60分
    int index = Arrays.binarySearch(scores, 60);
    if(index<0){
        System.out.println("没有正好60分的");
    }else{
        System.out.println("60分的索引位置:" + index);
    }

    //6、复制成绩最低三名构成新数组
    //int[] newArray = Arrays.copyOfRange(scores, 0, 3);
    int[] newArray = Arrays.copyOf(scores,  3);

    //7、用工具类打印成绩最低三名成绩
    System.out.println("成绩最低的三名同学是:" +  Arrays.toString(newArray));
}

数组中常见的异常

0x01:ArrayIndexOutOfBoundsException

数组角标越界异常,访问数组的下标越界时

例如:

int[] arr = new int[2];
System.out.println(arr[	2]);
System.out.println(arr[-1]);
访问到了数组中的不存在的脚标时发生。

0x02:NullPointerException

空指针异常,以下是出现该异常时的一些场景

  • 赋值为 null

  • 访问值为 null 的数组下标

  • 调用值为 null 的对象的一些相关方法时

    例如 arr[0] = null ,执行了 arr[0].toString()

0xFF:其他

待补充

一些需要注意的问题

0x01:操作二维数组的注意点

操作二维数组不应使用常数来控制维数。具体方法是 array.length 表示行数,array[row].length 来表示 row 行的列数。这样当数组行数和列数不相等时,代码可以自动调整为正确的值。

0xFF:其他

待补充

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://codeyee.com/archives/java-array.html