7.数组

一、数组的概述

1.定义

  多个相同数据类型的数据按照一定的顺序排列的集合,使用一个名字命名,并通过编号的方式对这些数据进行统一管理。

2.特点

  ①数组是有序排列的;

  ②数组本身是引用数据类型,数组中的元素既可以是基本数据类型,也可以是引用数据类型;

  ③创建数组会在内存中开辟一整块连续的空间,而数组通过数组名引用的是这块连续空间的首地址;

  ④数组一旦初始化完成,其长度就确定了;数组的长度一旦确定,就不能修改;

  ⑤通过索引来访问数组中的元素,速度很快

3.分类

按照维数:一维数组、二维数组、多维数组

按照数组中元素的类型:基本数据类型元素的数组、引用数据类型元素的数组

二、一维数组

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

public class test {
    public static void main(String[] args) {
        //数组的声明
        int[] arr1;
        String arr2[];
        //数组的静态初始化
        arr1 = new int[]{1, 2, 3};
        //数组的动态初始化
        arr2 = new String[4];
        //声明+初始化
        int[] arr3 = new int[3];
        //类型推断
        String[] arr4 = {"str1", "str2", "str3"};
    }
}

2.访问一维数组中的元素

public class test {
    public static void main(String[] args) {
        int[] arr = new int[]{1, 2, 3, 4, 5};
        //访问数组中的元素:索引访问
        System.out.println(arr[2]);//3
    }
}

3.一维数组的长度

public class test {
    public static void main(String[] args) {
        int[] arr = new int[]{1, 2, 3, 4, 5};
        //数组的长度:调用数组对象的length属性
        System.out.println(arr.length);//5
    }
}

4.一维数组的遍历

public class test {
    public static void main(String[] args) {
        int[] arr = new int[]{1, 2, 3, 4, 5};
        //数组的遍历:循环
        for (int i = 0;i < arr.length;i++){
            System.out.println(arr[i]);
        }
    }
}

5.一维数组的默认初始化值

public class test {
    public static void main(String[] args) {
        //一维数组的默认初始化值
        //整形
        byte[] arr1 = new byte[3];
        short[] arr2 = new short[3];
        int[] arr3 = new int[3];
        long[] arr4 = new long[3];
        System.out.println(arr1[1]);//0
        System.out.println(arr2[1]);//0
        System.out.println(arr3[1]);//0
        System.out.println(arr4[1]);//0

        //浮点型
        float[] arr5 = new float[3];
        double[] arr6 = new double[3];
        System.out.println(arr5[2]);//0.0
        System.out.println(arr6[2]);//0.0

        //字符型
        char[] arr7 = new char[3];
        if (arr7[0] == '\u0000'){
            System.out.println("hello!");//hello!
        }

        //boolean型
        boolean[] arr8 = new boolean[3];
        System.out.println(arr8[1]);//false

        //引用数据类型
        String[] arr9 = new String[3];
        System.out.println(arr9[0]);//null
    }
}

6.一维数组的内存解析

 

 三、二维数组

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

public class test {
    public static void main(String[] args) {
        //静态初始化
        String[][] arr1 = new String[][]{{"张三", "李四"}, {"小明", "小花", "小王"}};
        //动态初始化1
        int[][] arr2 = new int[3][2];
        //动态初始化2
        int[][] arr3 = new int[3][];
        //类型推断
        int[][] arr4 = {{1, 2}, {1, 2, 5}};
    }
}

2.访问二维数组中的元素

public class test {
    public static void main(String[] args) {
        //访问二维数组的元素
        String[][] arr1 = new String[][]{{"张三", "李四"}, {"小明", "小花", "小王"}};
        int[][] arr2 = new int[3][2];
        int[][] arr3 = new int[3][];
        System.out.println(arr1[0][1]);//李四
        System.out.println(arr2[2][1]);//0
        System.out.println(arr3[1]);//null
//        System.out.println(arr3[0][1]);//报异常:NullPointerException
    }
}

3.二维数组的长度

public class test {
    public static void main(String[] args) {
        //二维数组的长度
        String[][] arr1 = new String[][]{{"张三", "李四"}, {"小明", "小花", "小王"}};
        System.out.println(arr1.length);//2
        System.out.println(arr1[1].length);//3
    }
}

4.遍历二维数组

public class test {
    public static void main(String[] args) {
        //二维数组的遍历
        String[][] arr1 = new String[][]{{"张三", "李四"}, {"小明", "小花", "小王"}};
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr1[i].length; j++) {
                System.out.println(arr1[i][j]);
            }
        }
    }
}

5.二维数组的默认初始化值

public class test {
    public static void main(String[] args) {
        //二维数组的默认初始化值
        //方式一:
        int[][] arr1 = new int[3][2];
        /*
        外层元素:地址值
        内层元素:跟一维数组的初始化情况相同
         */
        System.out.println(arr1[0]);//[I@4e50df2e
        System.out.println(arr1[0][1]);//0

        //方式二:
        int[][] arr2 = new int[3][];
        /*
        外层元素:null
        内层元素:不存在,无从谈起;强行调用,报错
         */
        System.out.println(arr2[1]);//null
//        System.out.println(arr2[1][0]);//NullPointerException
    }
}

6.二维数组的内存解析

 

 四、数组中的常见算法

1.数组元素的赋值

打印10行的“杨辉三角”:

public class test {
    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];
            //2.1 给首末元素赋值
            yangHui[i][0] = yangHui[i][i] = 1;
            //2.2 给每行的非首末元素赋值
            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();
        }
    }
}

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

public class test {
    public static void main(String[] args) {
        //定义一个整形数组,数组中有10个元素,且每一个元素都是随机的两位数
        int[] arr = new int[10];
        int num;
        for (int i = 0; i < arr.length; i++) {
            num = (int)(Math.random() * (99 - 10 + 1) + 10);
            arr[i] = num;
        }
        //遍历数组中的元素
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        //求最大值
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (max < arr[i]){
                max = arr[i];
            }
        }
        System.out.println("最大值为:" + max);//最大值为:93

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

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

        //求平均值
        int avg = sum / arr.length;
        System.out.println("平均值为:" + avg);//平均值为:49
    }
}

3.数组的赋值和复制

数组的赋值:

  将数组1的地址值赋给数组2,使得数组1和数组2同时指向了堆空间中的同一个对象实体。

数组的复制:

  完全copy一份,相当于堆空间中创建一个新的对象实体。

public class test {
    public static void main(String[] args) {
        //数组的复制
        int[] arr1 = new int[]{1, 2, 5, 6};
        int[] arr2 = new int[arr1.length];
        for (int i = 0; i < arr1.length; i++) {
            arr2[i] = arr1[i];
            System.out.println(arr2[i]);
        }
    }
}

 

 4.数组的反转

public class test {
    public static void main(String[] args) {
        //数组的反转
        int[] arr = new int[]{2, 5, 8, 3};
        for (int i = 0; i < arr.length / 2; i++) {
            int temp = arr[i];
            arr[i] = arr[arr.length - i - 1];
            arr[arr.length - i - 1] = temp;
        }
        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

5.二分法查找

public class test {
    public static void main(String[] args) {
        //二分法查找
        int[] arr = new int[]{-98,-34,2,34,54,66,79,105,210,333};
        int dest = 79;
        int start = 0;
        int end = arr.length - 1;
        boolean isFlag = true;
        while (start <= end){
            int middle = (start + end) / 2;
            if (dest == arr[middle]){
                System.out.println("找到了数组中的元素, 其索引为:" + middle);
                isFlag = false;
                break;
            }else if (dest < arr[middle]){
                end = middle - 1;
            }else {
                start = middle + 1;
            }
        }
        if (isFlag){
            System.out.println("很遗憾,没有找到指定元素");
        }
    }
}

6.十大排序算符

 

 手写冒泡排序:

public class test {
    public static void main(String[] args) {
        //手写冒泡排序
        int[] arr = new int[]{43,32,76,-98,0,64,33,-21,32,99};
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - i - 1; 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");//-98    -21    0    32    32    33    43    64    76    99
        }
    }
}

五、Arrays工具类的使用

1.理解:

①属于java.util包下的工具类;

②里面定义了许多操作数组的方法;

 

 2.使用

public class test {
    public static void main(String[] args) {
        //Arrays工具类的使用
        int[] arr1 = new int[]{1, 2, 3, 4};
        int[] arr2 = new int[]{1, 2, 3, 4};

        //equals:判断两个数组是否相等
        boolean equals = Arrays.equals(arr1, arr2);
        System.out.println(equals);//true

        //toString:输出数组信息
        System.out.println(Arrays.toString(arr1));//[1, 2, 3, 4]

        //fill:将指定值填充到数组中
        Arrays.fill(arr2, 10);
        System.out.println(Arrays.toString(arr2));//[10, 10, 10, 10]

        //sort:对数组进行排序
        int[] arr = new int[]{2, 5, 8, 1, 28, 23};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));//[1, 2, 5, 8, 23, 28]

        //binarySearch:查找数组中的元素,并返回索引
        int dest = 28;
        int index = Arrays.binarySearch(arr, dest);
        if (index >= 0) {
            System.out.println(index);//5
        }else {
            System.out.println("未找到");
        }
    }
}

六、数组中的常见异常

1.数组角标越界:ArrayIndexOutOfBoundsException

public class test {
    public static void main(String[] args) {
        int[] arr = new int[3];
//        System.out.println(arr[3]);//ArrayIndexOutOfBoundsException
    }
}

2.空指针异常:NullPointerException

public class test {
    public static void main(String[] args) {
        int[] arr = new int[3];
//        //情况一:
//        arr = null;
//        System.out.println(arr[0]);//NullPointerException

        //情况二:
        int[][] arr1 = new int[3][];
        System.out.println(arr1[1][0]);//NullPointerException
    }
}

 

 

 

作者:Java之美

日期:2020-03-28

7.数组

全文结束