6.27课堂笔记 数组

6.27 课堂笔记 数组

1、数组概述

  • 数组是一个引用类型,父类是Object。

  • 数组实际是一个容器,是一个数据的集合。

  • 数组中既可以存储基本数据类型,也可以存储引用数据类型。

  • 数组因为是引用数据类型,所以数组存储在堆内存中。

  • 数组存储对象是,存储的是对象的内存地址,而不是直接存储对象。

  • 数组一旦创建,长度不可变。

  • 数组的分类:一维,二维,三维。

  • 数组自带length属性,用来获取数组的长度。

  • 数组中的元素类型统一。

  • 数组中的元素内存地址连续。

  • 所有的数组都是用第一个元素的地址作为整个数组的内存地址。

  • 元素有下标(索引),从0开始。

  • 数组优缺点:

    ​ 优点:查询/查找/检索某个下标上的元素时效率极高。可以说是查询效率最高的一个数据结构。
    ​ 为什么检索效率高?
    ​ 第一:每一个元素的内存地址在空间存储上是连续的。
    ​ 第二:每一个元素类型相同,所以占用空间大小一样。
    ​ 第三:知道第一个元素内存地址,知道每一个元素占用空间的大小,又知道下标,所以
    ​ 通过一个数学表达式就可以计算出某个下标上元素的内存地址。直接通过内存地址定位
    ​ 元素,所以数组的检索效率是最高的。

    数组中存储100个元素,或者存储100万个元素,在元素查询/检索方面,效率是相同的,
    因为数组中元素查找的时候不会一个一个找,是通过数学表达式计算出来的。(算出一个
    内存地址,直接定位的。)
    缺点:
    第一:由于为了保证数组中每个元素的内存地址连续,所以在数组上随机删除或者增加元素的时候,
    效率较低,因为随机增删元素会涉及到后面元素统一向前或者向后位移的操作。
    第二:数组不能存储大数据量,为什么?
    因为很难在内存空间上找到一块特别大的连续的内存空间。

    注意:对于数组中最后一个元素的增删,是没有效率影响的。

2、数组的定义

  • 语法格式:
    int[] array1;
    double[] array2;
    boolean[] array3;
    String[] array4;
    Object[] array5;

  • 初始化数组,数组的定义

1、动态初始化

int[] array = new int[5];// 这里的5表示数组的元素个数。
// 初始化一个5个长度的int类型数组,每个元素默认值0
String[] names = new String[6]; // 初始化6个长度的String类型数组,每个元素默认值null。

2、静态初始化

int[] array = {100, 2100, 300, 55};

public static void main(String[] args) {
     
        //数组
        /*
            数组的定义
                1、动态定义,使用new关键字创建数组
                    int [] array1 = new int[数组长度];
                2、静态定义
                    int [] array2 = {1,2,3};
         */

        //1、动态定义,定义了一个数组长度为3的int类型的数组
        int [] array1 = new int[3];


        //2、数组对应的索引的赋值     数组变量名[下表/索引]
        array1[0] = 1;
        array1[1] = 2;
        array1[2] = 3;


        System.out.println(array1[0]);
        System.out.println(array1[1]);
        System.out.println(array1[2]);

        //4、获取数组最后一个索引的数据
        System.out.println(array1[array1.length-1]);
    }

3、数组的遍历

在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历。数组的遍历使用for循环

//定义数组
int[] arr = {
     1,2,3,4,5};

//使用for循环遍历
for(int i = 0;i<arr.length;i++){
     
    System.out.println(arr[i])
}

//使用高级for循环
/*
    for (每一个元素的数据类型 临时变量名: 要循环的容器的变量名) {
        System.out.println(i)
    }
*/
for(int i :array1){
     
	System.out.println(i);
}

4、数组最值的获取

4.1最大值的获取

	/**
     * @param array 传入数组
     * @return 数组索引对应的最大值
     */
    public static int getArrayMax(int[] array) {
     

        //定义临时最大值变量
        int max = array[0];
        for (int i = 1; i < array.length; i++) {
     
            //判断,当索引对应的值大于max时,将这个值赋给max
            if (max < array[i]) {
     
                max = array[i];
            }
        }
        //返回最大值
        return max;
    }

调用以上的方法

 public static void main(String[] args) {
     

        //使用静态定义,定义一个数组
        int [] array01 = {
     2,4,6,8,9,11};		
		//调用数组工具类中的获取数组最大值的方法,并接受最大值
        int maxNum = ArrayUtil.getArrayMax(array01);
        System.out.println("数组最大值maxNum = " + maxNum);
}

输出结果数组最大值maxNum = 11。

4.2最小值的获取

 /**
     * @param array 传入数组
     * @return 数组索引对应的最小值
     */
    public static int getArrayMin(int[] array) {
     

        //定义临时最小值变量
        int min = array[0];
        for (int i = 1; i < array.length; i++) {
     
            //判断,当索引对应的值小于min时,将这个值赋给min
            if (min > array[i]) {
     
                min = array[i];
            }
        }
        //返回最小值
        return min;
    }

调用以上的方法


public static void main(String[] args) {
     

        //使用静态定义,定义一个数组
        int [] array01 = {
     2,4,6,8,9,11};
    	//调用数组工具类中的获取数组最小值的方法,并接受最小值
        int minNum = ArrayUtil.getArrayMin(array01);
        System.out.println("数组最小值minNum = " + minNum);
}

输出结果数组最小值minNum = 2。

5、两个异常

5.1数组越界异常

每个数组的索引都有一个范围,即0~length-1。在访问数组的元素时,索引不能超出这个范围,否则程序会报错(ArrayIndexOutOfBoundsException)

int[] array1 ={
     1, 2, 3};
//以下代码编译正常,但编译报错ArrayIndexOutOfBoundsException
System.out.println(array1[3]);

array1数组的索引最大值为2,当访问array1[3]时,超出了范围,系统报错

5.2空指针异常

在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常(NullPointerException)

int[] array1 ={
     1, 2, 3};

//以下代码编译正常,运行报错NullPointerException
array1 = null;
System.out.println(array1.length);

6、数组的排序

选择排序法

概述:

​ 将下标为0的元素当做是数组中最小的值,将该值分别与之后索引对应的值一一对比,若有值比该值更小的元素,则把这两个值的位置调换,那么再使用较小元素,再接着与后面的元素比较,若还有比这个较小的元素更小,则把这两个值的位置调换。直到把所有的元素比完,这样最小的元素就会出现在第一位。然后在进行第二遍排序,从下标1开始,重复length-1次。这样排序就完成了

public class ArrayTest06 {
     
    // 需求:{3, 7, 6, 9, 2, 1, 8} 请按照从小到大排序返回
        /*
            0. 前置条件,假设索引为 0 的数字最小
            1. 找到最小数的索引
            2. 将最小数移动至数组第一个索引
         */
    public static void main(String[] args) {
     
        //定义一个int类型的数组
        int[] array = {
     3, 7, 6, 9, 2, 1, 8};
        //调用排序的方法并接收返回的数组
        int[] array1 = sortArrays(array);
        System.out.println(ArrayUtil.printArray(array1));

    }

    /**
     * 将int类型的数组进行按从小到大的方式排序的方法,选择排序法
     *
     * @param array 传入的int类型的数组
     * @return 排好序的数组
     */
    public static int[] sortArrays(int[] array) {
     

        for (int i = 0; i < array.length - 1; i++) {
     
            for (int j = i + 1; j < array.length; j++) {
     
                //假设索引为i时的数组元素为最小值
                int min = i;
                //将最小值循环与它后面的值进行比较,若后面的值更小则替换
                if (array[j] < array[min]) {
     
                    int temp = array[min];
                    array[min] = array[j];
                    array[j] = temp;
                }
            }
        }
        //返回排好序的数组
        return array;
    }
}

7、二维数组

二维数组属于多维数组,那么什么是多维数组呢,当数组元素的类型是数组时就成了多维数组,

//1、二维数组的定义
        int[][] array1 = new int[3][4];//动态定义
        int[][] array2 = {
     {
     1,2,3},{
     4,5,6,7},{
     8,9,0,10,11}};//静态定义
//2、二维数组的赋值
		array1[0][1]=1;
		array1[0][2]=2;
		array1[0][3]=3;
		array1[0][4]=4;
//3、二维数组的遍历
        for (int i = 0; i < array2.length; i++) {
     
            for (int j = 0; j < array2[i].length; j++) {
     
                System.out.println("array2 [" + i + "]" + "[" + j + "]=" + array2[i][j]);
            }
        }

8、Java自带工具类的方法

java.util.Arrays 包下有许多关于数组的方法。

  • Arrays.sort()方法 排序 从小到大
  • Arrays.fill(int[] a,int val)方法 将指定的int值val来替换数组的每个元素的值
  • Arrays. fill(int[] a, int fromIndex, int toIndex, int val)将指定的int值val来替换数组的指定区间索引内的值。左闭右开
  • Arrays.copyOf(int[] original, int newLength)拷贝数组指定拷贝的索引从0开始到newLength结束
  • Arrays.copyOfRange(int[] original, int from, int to)将指定的数组指定的范围复制到一个新的数组中。左闭右开
    public static void main(String[] args) {
     

        //定义一个int类型的数组
        int[] arr = {
     3, 6, 7, 9, 2, 4, 8, 1, 5};

        // Arrays.sort()方法 排序 从小到大
        Arrays.sort(arr);

        //Array.toString()方法,将数组转换为字符串
        System.out.println(Arrays.toString(arr));

        //Arrays.fill(int[] a,int val)方法 将指定的int值val来替换数组的每个元素的值
        //Arrays.fill(arr,0);
        //System.out.println(Arrays.toString(arr));

        //fill(int[] a, int fromIndex, int toIndex, int val)
        //将指定的int值val来替换数组的指定区间索引内的值。左闭右开
        Arrays.fill(arr,0,2,1);
        System.out.println(Arrays.toString(arr));

        // copyOf(int[] original, int newLength)
        // 拷贝数组指定拷贝的索引从0开始到newLength结束
        int[] result = Arrays.copyOf(arr,5);
        System.out.println(Arrays.toString(result));

        //copyOfRange(int[] original, int from, int to)
        //将指定的数组指定的范围复制到一个新的数组中。左闭右开
        int[] result1 = Arrays.copyOfRange(arr,1,5);
        System.out.println(Arrays.toString(result1));
    }

你可能感兴趣的:(我的课堂笔记,java,数据结构)