• 同C语言,Java数组属于引用类型,但是数组的元素可以是引类型也可以是基本(值)类型。
  • 数组在内存中的存储是连续的。
  • 数组长度一旦确定,就不可修改。

    1. 一维数组

    1.1 声明和初始化

    首先,因为数组是引用类型,所以数组的初始化都要使用关键词 new。数组的初始化分为两种,静态初始化和动态初始化。
    静态初始化】数组的初始化和数组元素的赋值操作同时进行。

    1. class test {
    2. public static void main(String[] args){
    3. // 1. 静态初始化
    4. int[] ids1 ; //声明
    5. ids1 = new int[]{1,2,3}; // 初始化
    6. int[] ids2 = new int[]{1,2,3}; // 声明与初始化同时进行
    7. }
    8. }

    动态初始化】数组初始化时先确定长度,但是不赋值。

    class test {
      public static void main(String[] args){
          // 2. 动态初始化
          int[] ids1 = new int[5];
          String[] name = new String[10];
      }
    }
    

    image.png

    1.2 获取数组长度

    使用数组的 length 属性。

    class test {
      public static void main(String[] args){
          // 动态初始化
          String[] name = new String[10];
          System.out.println(name.length);
      }
    }
    

    image.png

    1.3 内存分布

    数组是引用类型,内存分布在 里。详细来说,数组的声明在栈中进行,栈中一个单元指向该数组在堆中的地址,而数组的内容(new出来的东西)在堆中动态存储,其分布如下图所示:image.png

    1.4 默认初始值

  • 整形:0 (byte、short、int、long)

  • 浮点型:0.0 (float、double)
  • char型:’\0’ 空字符
  • boolean型:false
  • 引用类型:null (包括String)

2. 二维数组

2.1 声明与初始化

静态初始化

class test {
    public static void main(String[] args){
        // 静态初始化
        String[][] names = new String[][] {{"zhangsan","lisi"},{"wangwu"},{}};
        System.out.println(names.length);  // 输出3
        // 二维数组的长度就是第一维的长度
    }
}

动态初始化

class test {
    public static void main(String[] args){
        // 动态初始化1
        String[][] names1 = new String[4][3] ;
        // 动态初始化2
        String[][] names2 = new String[4][] ;
    }
}
动态初始化时,行长度不可省略,列长度可以省略。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2643809/1626254484834-d13a6749-4056-48bd-bc2f-4794424a9f55.png#clientId=ua9f47d39-a1dd-4&from=paste&height=198&id=u61484794&margin=%5Bobject%20Object%5D&name=image.png&originHeight=182&originWidth=515&originalType=binary&ratio=1&size=14769&status=done&style=none&taskId=ue2784275-8fe2-472c-a649-ee029b7711f&width=559)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2643809/1626254498422-c4f370ca-2ae0-4303-a87b-479299d92306.png#clientId=ua9f47d39-a1dd-4&from=paste&height=185&id=u3291ee3d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=185&originWidth=652&originalType=binary&ratio=1&size=17296&status=done&style=none&taskId=u653f443e-25f5-48a7-8337-4bf4879250a&width=652)<br />二维数组的元素调用和C语言的方法一致。<br />当然,也可以单行初始化:

image.png
2.2 默认初始值

2.2.1 内层元素

内层元素的默认初始值与一维数组完全一致,但是要注意的是,调用二维数组内层元素的时,其第二维长度必须已经声明,否则运行时会报空指针的错误:
image.png

2.2.2 外层元素

 每一个外层元素相当于一个一维数组,因此外层元素的初始值就是其一维数组的地址。当第二维长度未设置时,每一行都是一个空指针,所以此时外层元素初值都是 null:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2643809/1626255678110-5cc68787-317f-436e-9979-f74a2b2a1d1c.png#clientId=ua9f47d39-a1dd-4&from=paste&height=210&id=u51461649&margin=%5Bobject%20Object%5D&name=image.png&originHeight=210&originWidth=827&originalType=binary&ratio=1&size=29241&status=done&style=none&taskId=udf342056-8f03-4a77-84f9-d7b4dbae5f9&width=827)<br />反之,其初值就是每一行的首址:

image.png
2.3 内存结构

image.png