目录
数组是一种类型
数组也是一种类型,我们可以认为用作定义数组类型的 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 没有多维数组,但可以模拟多维数组,因为数组本身是引用类型,数组元素可以是引用类型,所以只要每个数组元素的类型也是数组,那么就相当于将一维数组扩展成多维数组。
定义二维数组的语法:
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}};