数组

发布时间 2023-08-17 10:56:10作者: 小Y的开发笔记

数组

概述

  1. 一次性声明大量的用于存储数据的变量
  2. 这写存储的数据一般都是相同的数据类型
  3. 数组是一个用于存储多个相同类型数据的存储模型

数组的定义

  1. 范例1

    int [] arr;(推荐使用)

    含义:先定义数组,在定义数组名

  2. 范例2
    int arr [];
    含义:先定义数组名,在定义数组;

数组的初始化

  1. 动态初始化
  2. int [] arr = new int[5];
package com.ygc;

/**
 * @author: YGC
 * @createTime: 2023/08/16 22:30
 * @blogs: https://www.cnblogs.com/ygcDiary
 * @description: 数组
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr = new int[5];
        /*
        1.int 数组的数据类型 []代表数组
        2. arr代表的数组名
        3. 第二个int 表示的时数组的数据类型要与前面定义的相同
        4.[5]表示定义了一个数组长度为5的数组[0-4]
        5.数组会分配一个初始值,值是多少油数据类型决定
        * */
    }
}

数组的访问

需要注意的是,数组从0开始计算

public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr = new int[5];
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        int c = arr[2];
        System.out.println("c=" + c);
    }
}

数组的内存分配

  1. 做new操作时都会将该对象(实例)存放在堆内存中
  2. 堆内存会将该实例的地址赋值给栈内存,也就是定义数组的时候的数组名
  3. 此时输出的是该数组在堆内存中的地址,用于栈内存访问
System.out.println(arr);//[I@4554617c

访问顺序

执行程序时,先根据栈内存中的地址,访问到堆内存,然后根据下标找到对应的数

注意事项

  1. 数组在初始化的时候,会为存储空间分配默认值

int :0

double :0.0

boolean :false

String : 空字符

  1. 如果数组指向相同的堆内存地址,则不会在开辟新的空间,而是将原来的空间取代
package com.ygc;
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr1 = new int[5];
        arr1[0] = 100;
        arr1[1] = 50;
        System.out.println(arr1);//[I@4554617c
        System.out.println(arr1[0]);
        System.out.println(arr1[1]);
        int [] arr2 = arr1 ;//将内存赋值给arr2
        arr2[0] = 300;
        arr2[1] = 10;
        System.out.println(arr2);//[I@4554617c
        System.out.println(arr2[0]);//300
        System.out.println(arr2[1]);//10
        System.out.println(arr1[0]);//300
        System.out.println(arr1[1]);//10
    }
}

栈内存

  1. 栈内存是一片存储区域,用来存储局部变量
  2. 堆内存:凡是通过new建立的都是在堆内存中,存放的都是 实体(对象 )

数组静态初始化

​ 静态初始化指的就是,在数组初始化的时候,赋给数组值,并由系统决定数组的长度

格式

int [] arr = new int[]{1,2,3}

数组类型[] 数组名 = new 数组类型[]{数组元素}

简化

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

数组类型[] 数组名 = {数组元素}

package com.ygc;

/**
 * @author: YGC
 * @createTime: 2023/08/17 9:57
 * @blogs: https://www.cnblogs.com/ygcDiary
 * @description: 静态数组
 */
public class ArrDemo01 {
    public static void main(String[] args) {
        /*定义一个静态数组*/
        int[] arr = {1,2,3,4};
        int[] arr1 = new int[]{1,2,3,4,5};
        System.out.println(arr[0]);
        System.out.println(arr1[4]);
    }
}

常见问题

  1. 数组访问越界,意思是定义了一个四个长度的数组却引用了第五个元素
package com.ygc;

/**
 * @author: YGC
 * @createTime: 2023/08/17 10:01
 * @blogs: https://www.cnblogs.com/ygcDiary
 * @description: 数组常见错误
 */
public class ArrDemo02 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4};
        System.out.println(arr[4]);

    }
}
//错误代码
/*Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
	at com.ygc.ArrDemo02.main(ArrDemo02.java:12)*/
  1. 空指针异常,意思是原数组已经不在堆内存中具有地址,但你仍然使用数组名访问数组元素
package com.ygc;

/**
 * @author: YGC
 * @createTime: 2023/08/17 10:01
 * @blogs: https://www.cnblogs.com/ygcDiary
 * @description: 数组常见错误
 */
public class ArrDemo02 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4};
        arr = null;
        System.out.println(arr[3]);
/*空指针异常
java.lang.NullPointerException
*/
    }
}

数组遍历

使用for循环实现数组的遍历

package com.ygc;

/**
 * @author: YGC
 * @createTime: 2023/08/17 10:18
 * @blogs: https://www.cnblogs.com/ygcDiary
 * @description: 遍历数组
 */
public class ArrDemo03 {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4};
        for (int i = 0; i < 4; i++) {
            System.out.println(arr[i]);
        }
    }
}

使用API进行数组的遍历

arr.length:表示的是数组的长度,数组元素的个数,不是数组的下标

package com.ygc;

/**
 * @author: YGC
 * @createTime: 2023/08/17 10:18
 * @blogs: https://www.cnblogs.com/ygcDiary
 * @description: 遍历数组
 */
public class ArrDemo03 {
    public static void main(String[] args) {
        int[] arr1 = {66,77,88,99};
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
    }
}

练习

  1. 输出数组的一个最大值
package com.ygc;

/**
 * @author: YGC
 * @createTime: 2023/08/17 10:39
 * @blogs: https://www.cnblogs.com/ygcDiary
 * @description: 数组获取最大值
 */
public class ArrExer01 {
    public static void main(String[] args) {
        int tempMax = 0;
        int max = 0;
        int[] arr = {170,162,131,168,190};
        /*此时arr.length不满足条件,因为下面需要使用arr[i+1],会使数组下标越界*/
        for (int i = 0; i < arr.length-1; i++) {
            if (arr[i] > arr[i+1]) {
                tempMax = arr[i];
                arr[i+1] = arr[i];
                arr[i+1] = tempMax;
            }
            max = arr[i+1];
         }
        System.out.println("最大的值是:"+max);
    }
}

package com.ygc;

/**
 * @author: YGC
 * @createTime: 2023/08/17 10:22
 * @blogs: https://www.cnblogs.com/ygcDiary
 * @description: 获取数组最大值练习
 */
public class ArrExer {
    public static void main(String[] args) {
        int[] arr = {170,162,131,168,190};
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        System.out.println("最大的值是:"+max);
    }
}