第四章、数组

754 阅读3分钟

1、数组简介

1.1 数组初始化

为什么要使用数组呢?

因为有了数组可以更好的存储同类型的值,并做一些操作。

那么如何定义数组呢?

  • 动态初始化方式1:数据类型 数组名[] = new 数据类型[数组长度];
  • 动态初始化方式2:数据类型 数组名[]; 数组名 = new 数据类型[数组长度];
//数据类型 数组名[] = new 数据类型[数组长度];
double scores[] = new double[6];
//或者
double score1[];
score1 = new double[5];
  • 静态初始化方式:数据类型 数组名[] = {元素1,元素2...}
double scores[] = {10,20.3,14.2,5.5};

注意:可以是数据类型[] 数组名,可以是数据类型 数组名[]。

1.2 使用注意事项

  1. 数组是多个相同类型数据的组合,实现对这些数据的统一管理
  2. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
  3. 数组创建后,如果没有赋值,有默认值int-->0,short-->0,byte-->0,long-->0,float-->0.0,double-->0.0,char-->\u0000,boolean-->false,String-->null
  4. 数组的下标是从0开始的
  5. 数组下标必须在指定范围内使用,否则报:下标越界异常
  6. 数组属引用类型,数组型数据是对象(object)

案例1:求出一个数组 int[]的最大值 {4,-1,9, 10,23},并得到对应的下标

public class Array02 {
    public static void main(String[] args) {
        //求出一个数组 int[]的最大值 {4,-1,9,25,10,23},并得到对应的下标
        int[] arr = {4,-1,9,25,10,23};
        int maxLength = 0;
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > arr[maxLength]){
                maxLength = i;
            }
        }
        System.out.println("最大的值是" + arr[maxLength]);
        System.out.println("对应的下标是" + maxLength);
    }
}

2、数组的常见操作

2.1 数组拷贝

如果想拷贝数组,而且可以直接使用相互之前不影响,下面这种方式是不对的:

public class Array03 {
    public static void main(String[] args) {
        int[] arr1 = {1,2,3,4,5};
        int[] arr2 = arr1;
        System.out.println(Arrays.toString(arr2));
    }
}

因为这样只拷贝了一个地址,任何一方对其进行操作都会造成对另一引用的影响,所以要逐一拷贝里面的值。

public class Array03 {
    public static void main(String[] args) {
        int[] arr1 = {1,2,3,4,5};
        int[] arr2 = new int[arr1.length];
        for (int i = 0; i < arr1.length; i++) {
            arr2[i] = arr1[i];
        }
        arr1[1] = 3;
        System.out.println(Arrays.toString(arr2));
        System.out.println(Arrays.toString(arr1));
    }
}

这里我们可以简单的看一下Arrays.toString()源码:

public static String toString(int[] a) {
    if (a == null)
        return "null";
    int iMax = a.length - 1;
    if (iMax == -1)
        return "[]";

    StringBuilder b = new StringBuilder();
    b.append('[');
    for (int i = 0; ; i++) {
        b.append(a[i]);
        if (i == iMax)
            return b.append(']').toString();
        b.append(", ");
    }
}

先判断数组的值是不是null,或者数组是不是为空,也就是"[]"这样。如果都不是,就用StringBuilder去创建一个String参数,随着i逐渐增加会接近a.length - 1,也就是数组最大下标,这样据把全部数组打印出来return回去了。

2.2 数组反转

把数组元素调换一个位置:

public class Array04 {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6};

        for (int i = 0; i < arr.length/2; i++) {
            int temp = arr[i];
            arr[i] = arr[arr.length - 1 - i];
            arr[arr.length - i - 1] = temp;
        }

        System.out.println(Arrays.toString(arr));
    }
}

2.3 数组扩容

😎(难点)实例如下,好好看:

public class ArrayIncrease {
    public static void main(String[] args) {
        //动态添加数组的功能
        Scanner scanner = new Scanner(System.in);
        int[] arr = {1,2,3};
        do {
            int[] newArr = new int[arr.length + 1];
            for (int i = 0; i < arr.length; i++) {
                newArr[i] = arr[i];
            }
            System.out.println("输入你要添加的元素");
            int addNum = scanner.nextInt();
            newArr[newArr.length - 1] = addNum;
            arr = newArr;
            System.out.println("数组扩容后:" + Arrays.toString(arr));
            System.out.println("是否继续添加元素y/n?");
            char key = scanner.next().charAt(0);
            if (key == 'n'){
                break;
            }
        }while (true);
        System.out.println("退出");
    }
}

2.4 冒泡排序

img

代码如下:

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {10,20,4,8,1,30,15,9}; //8
        for (int i = arr.length - 1; i > 0; i--) {
            for(int j = 0;j < i;j++){
                if (arr[j] > arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

2.5 二分法查找

二分法查找的要求:数组必须是有序的。

img

二分法查找就是不断通过找中间值和比较,排除一部分值,如果是顺序查找需要和所有的值进行比较,而二分法则减少了比较次数。

public class BinarySearch {
    public static void main(String[] args) {
        int[] arr = {1,2,4,6,9,15,26,27,29,30,40,66,104,150};
        System.out.println(binarySearch(arr, 9));
    }

    /**
     * 二分法查找方法
     * @param arr   要查找的数组
     * @param target    目标
     * @return  返回索引下标
     */
    private static int binarySearch(int[] arr,int target){
        int begin = 0;
        int end = arr.length - 1;
        int middle;
        while(begin <= end){
            middle = (begin + end)/2;
            if (arr[middle] == target){
                return middle;
            }else if(arr[middle] > target){
                end = middle - 1;
            }else {
                begin = middle + 1;
            }
        }
        return -1;
    }
}

3、二维数组

一维数组,每个元素是一个值,而二维数组每一个元素是一个二维数组。

它的初始化也是有动态初始化和静态初始化两种方式:

  • 动态初始化方式1:int[][] a = new int[2][3];
  • 动态初始化方式2:int[][] a; a = new int[2][3];
  • 静态初始化方式:int[][] a = {1,2},{2,3},{3,4};
public class TwoDimensionArray {
    public static void main(String[] args) {
        //动态初始化1
        int[][] arr1 = new int[10][10];
        //动态初始化2
        int[][] arr2;
        arr2 = new int[6][6];
        //静态初始化
        int[][] arr3 = {{10,20},{20,30}};

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