各个语言中都有数组,但Java中是有区别的,Java中只有一维数组,没有多维数组,多维数组使用数组的数组来表示的。所以下面介绍的数组主要以一维数组来表示。
1.数组的定义
数组类型也是一种类型,本身是一种引用类型,例如int是一个基本数据类型,但是int[]就是一种引用数据类型。其定义方式有两种,分别为:
- 类型 数组名[]; 如:String arrayName1[]; int arrayName2[];
- 类型[] 数组名; 如:String[] arrayName1; int[] arrayName2;
推荐使用第二种声明方式,因为第二种声明方式具有更好的可读性,对于int[] arrayName方式,很容易可以理解成:定义一个变量arrayName,类型为int[]。
2.数组的初始化
Java在数组声明时并不为数组分配存储空间(不同于其它高级语言),仅有数组声明,而未分配存储空间。Java语言中数组必须先初始化,然后才可以使用。初始化包括数组的内存分配和对数组元素赋初始值。
Java数组的初始化分为两种方式:
- 静态初始化:数组定义与数组元素的空间分配和赋值操作同时进行。
- 动态初始化:数组定义与数组元素的空间分配和赋值操作分开进行。
2.1 静态初始化
数组初始化是指在声明数组的同时指定数组元素的初始值。
语法格式如下:arrayName = new type[] {element1, element2, …};
例如:
int[] intArray = new int[]{1, 2, 3, 4, 5};
double[] decArray = new double[]{1.1, 2.2, 3.3};
String[] strArray = new String[]{"Java", "Android", "FORTRAN"};
静态初始化还有一种简化的数据形式(比上面的方式用的更广泛):
int[] intArray = {1, 2, 3, 4, 5};
double[] decArray = {1.1, 2.2, 3.3};
String[] strArray = {"Java","Android","FORTRAN"};
注意:如下几种数组初始化方式是
不允许的:
int[] intArray = new int[5]{1, 2, 3, 4, 5}; //错误
int[5] intArray = new int[]{1, 2, 3, 4, 5}; //错误
int[5] intArray = {1, 2, 3, 4, 5}; //错误
数组的长度由程序自动计算,不需要我们手动写。
2.2 动态初始化
为已声明数组(类型 数组名[ ])动态分配空间的一般形式如下:
arrayName = new type[arrayLength];
注:数组大小也称为数组的长度,可以为整型常量或变量。
例如:
int[] value1;
value1=new int[10];
int[] value2=new int[10]; //声明数组的同时,用new运算符为数组分配空间
// int[10] value3 = new int[10]; //错误
2.3 一维数组的访问
一维数组的访问语法如下:
语法:数组[下标] 下标是从0开始的。
int[ ] a = new int[4];
a[0] = 20; //访问数组元素并赋值
a[1] = a[0] + 10;
其示意图如下:
注意:访问其他元素会产生数组越界错误,会出现异常:ArrayIndexOutOfBoundsException,如访问a[4]。
3.数组的内存表示
为数组分配空间有两种方法:数组初始化和使用new运算符;为数组分配空间后,数组变量指向数组存储空间的引用地址。其内存分配的过程如下:
首先,在int i这句话运行完后,在栈(Stack)空间中新建了一个int类型的空间,名称为i,如下:
其次,运行完int[] a这句话之后,只是在占空间中定义了一个int[] 类型的数组,名称为a,如下:
在运行完a=new int[4]后,这样才算在堆(Heap)内存中新建了一个长度为4个int类型数组,如下:
在运行完for循环后,数组的值也进行了重新赋值,如下:
全文完。转载请注明出处。