1. 数组就是用来储存一批同种类型数据的内存区域(可以理解为容器)。
  2. 当已经知道存入的元素值,用静态初始化。
  3. 当还不清楚要存入哪些数据,用动态初始化。

    1.静态初始化数组

    静态初始化数组的格式

  4. 定义数组的时候直接给数组赋值。

  5. 什么类型的数组存放什么类型的数据,否则报错。
  6. 数组一旦定义出来,程序执行的过程中,长度、类型就固定了。

//完整格式
数据类型 [ ] 数组名 = new 数据类型 [ ] {元素1,元素2,元素3……};
//简化格式
数据类型 [ ] 数组名 = {元素1,元素2,元素3……};

  1. int[] s = new int[] {1,2,3};
  2. int[] s ={1,2,3};
  • 数组变量名中储存的是数组在内存中的地址,数组是引用类型。

    数组的访问

  • 数组名[索引]

    1. int[] s ={1,2,3};
    2. System.out.print(s[0]);//输出:1

    数组的长度属性:length

  • 使用方法:数组名.length

    2.动态初始化数组

动态初始化数组的格式

  • 定义数组的时候只确定元素的类型和数组的长度,之后再存入具体数据。

数据类型 [ ] 数组名 = new 数据类型 [长度];

  1. int[] s = new int[3];
  2. //后赋值
  3. s[0] = 10;
  4. System.out.println(s[0]);//10

动态初始化数组后元素默认值

byte、short、int、char、long类型数组元素默认值都是0
float、double类型数组元素默认值是0.0
boolean类型数组元素的默认值是false、String类型数组元素的默认值是null

3.数组的遍历

  • 遍历:就是一个一个数据的访问。
    1. int arr[] =new int[]{1,2,3};
    2. for (int i = 0; i < arr.length; i++) {
    3. System.out.println(arr[i]);
    4. }
  1. public static void main(String[] args) {
  2. int[] data = new int[5];
  3. Random r = new Random();
  4. for (int i = 0; i < data.length; i++) {
  5. data[i] = r.nextInt(20) + 1;
  6. }
  7. Scanner sc = new Scanner(System.in);
  8. OUT:
  9. while (true) {
  10. System.out.println("输入一个1——20的整数进行猜测");
  11. int guessDate = sc.nextInt();
  12. for (int i = 0; i < data.length; i++) {
  13. if (data[i] == guessDate) {
  14. System.out.println("你猜中了");
  15. break OUT;
  16. }
  17. }
  18. System.out.println("猜测数据数组中不存在");
  19. }
  20. for (int i = 0; i < data.length; i++) {
  21. System.out.println(data[i]);
  22. }
  23. }
  1. public static void main(String[] args) {
  2. int[] codes = new int[5];
  3. Scanner sc = new Scanner(System.in);
  4. for (int i = 0; i < codes.length; i++) {
  5. System.out.println("请输入第" + (i + 1) + "个员工的工号");
  6. int code = sc.nextInt();
  7. codes[i] = code;
  8. }
  9. Random r = new Random();
  10. for (int i = 0; i < codes.length; i++) {
  11. int index = r.nextInt(codes.length);
  12. int temp = codes[index];
  13. codes[index] = codes[i];
  14. codes[i] = temp;
  15. }
  16. for (int i = 0; i < codes.length; i++) {
  17. System.out.println(codes[i]);
  18. }
  19. }

冒泡排序实现步骤:

  1. 定义一个外部循环控制总共需要几轮(数组的长度 - 1)
  2. 定义一个内部循环,控制每轮依次往后比较的几个位置(数组的长度 - i - 1)
    1. //冒泡排序
    2. public static void main(String[] args) {
    3. int[] arr = {5, 2, 3, 1};
    4. for (int i = 1; i <= arr.length - 1; i++) {
    5. for (int j = 0; j < arr.length - i - 1; j++) {
    6. if (arr[j] > arr[j + 1]) {
    7. int temp = arr[j + 1];
    8. arr[j + 1] = arr[j];
    9. arr[j] = temp;
    10. }
    11. }
    12. }
    13. for (int i = 0; i < arr.length; i++) {
    14. System.out.print(arr[i] + "\t");
    15. }
    16. }

    4.数组的内存图

  • Java内存分配介绍

image.png

  • 两个数组变量指向同一个数组对象

image.png

5.数组使用常见问题

  1. 问题1:如果访问的元素位置超过最大索引,执行时会出现ArrayindexOutOfBoundsException(数组索引越界异常)
  2. 问题2:如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现NullPointerException(空指针异常)