day04-java数组

2020/12/14 23:46:10

1. 数组-存储多个同类型的数据

1.1 数组定义

  1. 数据类型[] 变量名
  2. 数据类型 变量名[] 不推荐使用 定义一个int变量 该变量为数组

1.2 数组初始化

  1. 动态初始化 数据类型[] 变量名 = new 数据类型[数组长度] 数组里面的数据初始值由计算机分配

    int[] arr = new int[4];
    /* * 左边: int 数据类型 * [] 表明是数组 * arr 变量名 * 右边: new 申请空间 * int 存储数据类型 * [] 表明是数组 * 4 数组长度,元素个数 * */
    
  2. 静态初始化 数据类型[] 变量名 = new 数据类型[] {item1, item12, item13, ····} 指定数组里面每个元素的值,数组长度由计算机分配

    推荐简化格式 数据类型[] 变量名 = {item1, item12, item13, ····}

    // int[] arr = new int[] {1, 2, 3};
    int[] arr = {
         1, 2, 3}; 
    System.out.println(arr); // 地址 [I@16b98e56
    System.out.println(arr[0]); // 拿取arr地址 根据索引 获取地址中数据 1
    System.out.println(arr[1]); // 拿取arr地址 根据索引 获取地址中数据 2
    System.out.println(arr[2]); // 拿取arr地址 根据索引 获取地址中数据 3
    

1.3 数组元素访问

  1. 访问数组名----拿到数组地址

    int[] arr = new int[4];
    System.out.println(arr);
    // [I@16b98e56
    
  2. 访问数组元素—索引获取

    Note: 索引从零开始 到数组长度-1

    int[] arr = new int[4];
    
    System.out.println(arr[0]);
    System.out.println(arr[1]);
    System.out.println(arr[2]);
    System.out.println(arr[3]);
    

1.4 java内存分配

  1. 初始化内存分配

    1. 左边 int[] arr栈内存 创建数组变量 arr

    2. 右边 new int[4]堆内存中开辟连续空间 用地址例如[I@16b98e56表明整个数组位置 在连续空间中划分索引和存储数据

    3. 堆内存中不同数据类型初始化数据

      整数 0;
      浮点数 0.0;
      布尔值 false;
      字符 空字符;
      引用数据类型 null;
      
    4. 数组中元素是根据索引查找地址 arr[2] = arr地址 + 数据类型占用空间 * 2

  2. 访问流程

    1. System.out.println(arr); 拿到数组的地址[I@16b98e56
    2. System.out.println(arr[1]);先拿到数组的地址[I@16b98e56然后根据索引查找元素地址 arr地址 + int数据类型占用空间 * 1,最后拿到地址中的值0
  3. 栈内存堆内存的区别

    1. 栈内存 : 存储局部变量

      局部变量:定义在方法的变量 使用完立即消失

    2. 堆内存:存储new出来的内容(实体 new int[2] 对象 new Random())

      new 出来的内容都有地址值,使用完之后会在垃圾回收器空闲时被回收

1. 5 数组内存应用

  1. 单个数组内存

    int[] arr = new int[2]; // 左边 栈内存 arr 右边 堆内存 new 开辟空间 创建索引 初始化数值 返回地址
    System.out.println(arr); // 拿取arr地址 [I@16b98e56
    System.out.println(arr[0]); // 拿取arr地址 根据索引 获取地址中数据 0
    System.out.println(arr[1]); // 拿取arr地址 根据索引 获取地址中数据 0
    arr[0] = 100; // 拿取arr地址 根据索引 修改地址中数据 0变100
    System.out.println(arr); // 拿取arr地址 [I@16b98e56
    System.out.println(arr[0]); // 拿取arr地址 根据索引 获取地址中数据 100
    System.out.println(arr[1]); // 拿取arr地址 根据索引 获取地址中数据 0
    
  2. 多个数组内存 不同地址 不同变量 都有new

    double[] arr1 = new double[2]; // 左边 栈内存 arr1 右边 堆内存 new 开辟空间 创建索引 初始化数值 返回地址
    double[] arr2 = new double[3]; // 左边 栈内存 arr2 右边 堆内存 new 开辟空间 创建索引 初始化数值 返回地址
    System.out.println(arr1); // 拿取arr1地址 [D@16b98e56
    System.out.println(arr1[0]); // 拿取arr1地址 根据索引 获取地址中数据 0.0
    System.out.println(arr2); // 拿取arr2地址 [D@7ef20235
    System.out.println(arr2[0]); // 拿取arr2地址 根据索引 获取地址中数据 0.0
    arr1[1] = 1.23; // 拿取arr1地址 根据索引 修改地址中数据 0.0变1.23
    arr2[1] = 2.00; // 拿取arr2地址 根据索引 修改地址中数据 0.0变2.00
    System.out.println(arr1); // 拿取arr1地址 [D@16b98e56
    System.out.println(arr1[1]); // 拿取arr1地址 根据索引 获取地址中数据 1.23
    System.out.println(arr2); // 拿取arr2地址 [D@7ef20235
    System.out.println(arr2[1]); // 拿取arr2地址 根据索引 获取地址中数据 2.0
    
  3. 多个数组内存 相同地址 指向同一地址

    String[] arr1 = new String[2]; // 左边 栈内存 arr1 右边 堆内存 new 开辟空间 创建索引 初始化数值 返回地址
    System.out.println(arr1); // 拿取arr1地址 [Ljava.lang.String;@16b98e56
    System.out.println(arr1[0]); // 拿取arr1地址 根据索引 获取地址中数据 null
    String[] arr2 = arr1; // 将 arr1 的地址 赋值给 arr2 --arr1 arr2 指向同一地址
    arr2[0] = "java";  // 拿取arr2地址 根据索引 修改地址中数据 null变"java"
    System.out.println(arr1); // 拿取arr1地址 [Ljava.lang.String;@16b98e56
    System.out.println(arr2); // 拿取arr2地址 [Ljava.lang.String;@16b98e56
    System.out.println(arr1[0]); // 拿取arr1地址 根据索引 获取地址中数据 "java"
    System.out.println(arr2[0]); // 拿取arr2地址 根据索引 获取地址中数据 "java"
    

1.6 数组常见问题

  1. 索引越界

    int[] arr = new int[3];  // 索引 0 1 2
    System.out.println(arr[3]); // ArrayIndexOutOfBoundsException
    
  2. 空指针异常

    int[] arr = {
         1, 2, 3};
    System.out.println(arr); // [I@16b98e56
    System.out.println(arr[0]); // 1
    arr = null;
    System.out.println(arr); // null
    System.out.println(arr[0]); // NullPointerException
    
  3. null 空指针 引用类型的默认值,表示不指向任何有效对象

1.7 数组常见操作

  1. 遍历 数组名.length 数组元素个数

    int[] arr = {
         1, 3, 4, 0, 9, 3, 4, 5, 6, 7, 8, 0};
    for (int i = 0; i < arr.length; i++) {
         
        System.out.println(arr[i]);
    }
    
    int[] arr = {
         1, 3, 4, 0, 9, 3, 4, 5, 6, 7, 8, 0};
    for (int x: arr) {
          // 数组中每一个元素
        System.out.println(x);
    }
    
  2. 获取数组最值 遍历比较 数组第一个元素进行初始化

    int[] arr = {
         1, 3, 4, 0, 9, 3, 4, 5, 6, 7, 8, 0};
    int maxNum = arr[0];
    int minNum = arr[0];
    for (int x: arr) {
         
        maxNum = maxNum > x ? maxNum : x;
        minNum = minNum < x ? minNum : x;
    }
    System.out.println(maxNum);
    System.out.println(minNum);