目录

 

数组是一种类型

定义数组

数组初始化

静态初始化

动态初始化

var 定义数组


数组是一种类型

数组也是一种类型,我们可以认为用作定义数组类型的 int[],是与 int、short 等类型一样的一种数据类型。Java 要求数组的所有数组元素具有相同的数据类型,这里的类型既可以是基本类型,也可以是引用类型。

定义数组

Java 定义数组的语法:

type[] arrayName;
type arrayName[];

建议使用第一种,可以直接看出来这是在定义一个 type[] 类型的引用变量。(这个引用变量还未指向任务有效的内存)

数组初始化

定义数组之后必须对其进行初始化,否则无法使用。

Java 初始化数组的方式:

  • 静态初始化:显式指定每个数组元素的初始值,由系统决定数组长度。(给值不给长度)
  • 动态初始化:只指定数组长度,由系统为数组元素分配初始值。(给长度不给值)

静态初始化

静态初始化的语法:

arrayName = new type[] {element1, element2, ....}

type 可以是定义数组变量所使用的类型,或者是它的子类。其次,数组元素值也可以是 type 类型或者 type 的子类。例如:

int intArr;;
intArr = new int[] {1,2,3,4};
// 数组元素的类型是定义数组所用的类型的子类
Object objArr;
objArr = new String[] {"aa", "bb"};
// 数组元素值的类型是数组元素的类型的子类
Object objArr2;
objArr2 = new Object[] {"aa", "bb"};

可以将定义数组和初始化数组分成两步执行,也可以合并成一步,例如:

int[] intArr = new int[] {1,2,4};

静态初始化的简化语法:

int[] intArr = {1,2,4};

动态初始化

动态初始化的语法:

arrayName = new type[length];

type 可以是定义数组变量所使用的类型,或者是它的子类。例子:

int[] prices = new int[5];
Object[] books = new String[4];

动态初始化时,数组的元素值由系统分配初始值。有如下规则:

  • 整数类型(byte、short、int、long)的初始值是 0。
  • 浮点类型(float、double)的初始值是 0.0。
  • 字符类型(char)的初始值是 '\u0000'。
  • 布尔类型(boolean)的初始值是 false。
  • 引用类型(类、接口和数组)的初始值是 null。

var 定义数组

定义数组类型的局部变量时,可以用 var 定义,编译器可以根据指定的初始值推断出变量的类型。例如:

var names = new String[] {"aaa", "bbb"};
var weightArr = new double[4];

 引用类型数组的初始化

引用类型数组的数组元素是引用,所以给元素赋值必须传入一个引用。

class Person
{
    public int age;
    public double height;
    public void info()
    {
        System.out.println("我的年龄是:" + age + ",我的身高是:" + height);
    }
}

public class ReferenceArrayTest
{
    public static void main(String[] args)
    {
        Person[] students;          // 在栈内存中定义一个 Person[] 类型的变量 students
        students = new Person[2];   // 执行动态初始化
        var zhang = new Person();
        zhang.age = 20;
        zhang.height = 170;
        var lee = new Person();
        lee.age = 21;
        lee.height = 172;
        students[0] = zhang;
        students[1] = lee;
    }
}

引用变量 zhang 和 students[0] 指向堆内存里的同一个 Person 对象,而引用变量 lee 和 students[0] 指向堆内存里的同一个 Person 对象。栈内存和堆内存的情况如下:

Java 不用数组 java有数组类型吗_数组元素

定义多维数组

实际上,Java 没有多维数组,但可以模拟多维数组,因为数组本身是引用类型,数组元素可以是引用类型,所以只要每个数组元素的类型也是数组,那么就相当于将一维数组扩展成多维数组。

定义二维数组的语法:

type[][] arrName;

type[]是一种类型,type[] 加 [] 就相当于定义一个数组元素的类型为 type[] 的数组。

二维数组初始化:

arrName = new type[length][]

 length 表示一维数组的长度,即第一维的数组元素有多少个。同时,系统自动将这些元素的值指定为 null。

可以为某个数组元素直接指定一个数组类型的引用:

int[][] a;
a = new int[4][];
a[0] = new int[2];
a[0][1] = 6;

定义一个二维数组,并执行动态初始化:

int[][] b = new int[3][4];

定义一个二维数组,并执行静态初始化:

String[][] str1 = new String[][] {new String[3], new String[]{"hello"}};

定义一个二维数组,并执行简化的静态初始化:

String[][] str2 = {new String[3], new String[] {"hello"}};
int[][] arr = {{1,2,3}, {1,2,3}, {1,2,3}};