数组类型
数组也是一种类型
Java的数组要求所有的数组元素具有相同的数组类型。因此,在同一个数组中,数组元素的类型是唯一的。但是相互继承的类与类之间,可以看作类型是唯一的。
Java的数组既可以存放基本类型的数据,也可以存放引用类型的数据。值得指出的是,数组也是一种数据类型,不过它本身是一种引用类型。
定义数组
Java语言支持两种语法格式定义数组:
type[] arrayName;
type arrayName[];
不过我们建议使用第一种,第一种格式有较好的语意,容易理解。数组是一种引用类型的变量,因此它在定义一个变量的时候,仅仅表示它定义了一个引用类型(可以近似看作为一个指针),但这个引用类型并未指向任何有效内存,所以我们得对它进行初始化。
数组的初始化
Java语言的数组必须先进行初始化后才可以开始使用。所谓初始化,就是为数组的数组元素分配内存空间,并为每个数组元素赋值。那我们能不能只申请内存空间而不进行初始化?大家想下这个问题。
数组有两种初始化方式,分别为:
- 静态初始化:初始化时,程序员指定每个数组元素的初始值
- 动态初始化:初始化时,程序员指定数组的长度,由系统为我们分配初始值
静态初始化
静态初始化的语法格式如下:
arrayName = new type[] {element1, element2, element3 ... }
int[] intArr = new int[]{5, 6, 8, 30};
Object[] objArr = new String[] {"Java", "C++"};
动态初始化
动态初始化只指定数组的长度,由系统为每个数组元素指定初始值。
int[] prices = new int[5];
Object[] books = new String[4];
执行动态初始化时,程序员只需要指定数组的长度,即为每个数组元素指定所需的内存空间,系统将为这些数组分配初始值。
现在我们回答上面的问题。那我们能不能只申请内存空间而不进行初始化?大家想下这个问题。
答案是不行,一旦为数组的每个数组元素分配了内存空间,每个内存空间里存储的内容就是数组元素的值。即使这个内存空间存储的内容是空,这个空也是一个null值。初始值的获得有两种形式:一是系统自动分配,二是由程序员指定。
使用数组
数组中最常用的用法就是访问数组元素,包括对数组元素进行赋值和取出数组元素的值。此外,Java语言的数组索引都是从0开始的。
Object[] arr = new Object[2];
arr[0] = "hello";
arr[1] = "world";
foreach循环
使用foreach遍历数组和集合时,无需获得数组和集合的元素长度,foreach循环自动遍历数组和集合中的每个元素。
package Chapter04;
public class ForEachTest {
public static void main(String[] args) {
String[] books ={"Java","Spring","C++"};
for(String book : books)
System.out.println(book);
}
}
//Java
//Spring
//C++
深入数组
数组是一种引用数据类型,数组引用变量是一个引用,数组元素和数组变量在内存里是分开存放的。
内存中的数组
实际的数组对象被分配在堆(heap)内存中;如果引用该数组对象的数组引用是一个局部变量,那么它被存储在栈内存中。
当一个方法执行的时候,每个方法都会创建自己的内存栈,在这个方法中定义的局部变量将会逐个放入这个栈内存中。当方法执行结束的时候,这个方法栈中的内存将自然销毁。而程序中创建一个对象的时候,这个对象是保存到运行时的数据区中,以便反复利用,这个数据区就是堆内存,当没有任何引用指向该对象的时候,由系统的垃圾回收器销毁。
package Chapter04;
public class ArrayInRam {
public static void main(String[] args) {
int[] a={5,7,20};
int[] b=new int[4];
System.out.println("数组b的长度"+b.length);
b=a;
System.out.printf("数组b的长度"+b.length);
}
/**
* 输出:
* 数组b的长度4
* 数组b的长度3
*/
}
定义并初始化后。
让b引用指向a引用所指向数组后的示意图
多维数组
Java语言中提供了多维数组的语言,但是其实Java中并没有真正的多维数组,其实多维数组是引用的引用。Java语言中的数组类型是引用类型,所以所有的数组变量其实是一个引用。下面定义一个二维数组的语言。
type[][] arrName;
Java语言采用上面的语法格式来定义二维数组,但它的实质还是一维数组,只是它的数组元素变成对数组的引用。