Java数组
理解数组:数组也是一种类型
Java的数组要求所有的数组元素具有相同的数据类型,即一个数组中的元素类型全部一样,而不能存储多种数据类型的数据。
注:因为Java是面向对象的语言,而类与类之间可以继承关系这样可能产生一个数组存放多个数据类型的假象。
数组一但初始化完成,数组在内存中所占的空间将被固定下来,因此数组的长度不可以改变,即使把某个数组元素的数据清空,但它所占的空间依然被保留,依然属于该数组,数组长度不变。
Java数组即可以存储基本类型的数据,也可以存储引用类型的数据,只要所有的数组元素具有相同的类型即可。
值得指出的是,数组本身也是一种数据类型,它本身是一种引用类型。
定义数组
type[] arrayName //推荐使用这一种
或
type arrayName[]
数组是一种引用变量,定义完成后只是一个引用变量(也就是定义了一个指针),并且引用变量还示指向任何有效的内存,还没有内存空间来存储数组元素,因此数组也不能使用,所以要对数组进行初始化后才可以使用。
初始化数组
数组的初始化有如下两种方式。
- 静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。
arrayName = new type[]{element1,element2,element3,element4......}
//type类型要与数组定义时的type相同
//数组的每个元素要与是type类型的
//实例1
int[] intArr;
intArr = new int[]{1,2,3,4,5}
//实例2
Object[] objArr;
objArr = new String[]{"hello","world"};
注:因为Java是面向对象的编程语言,并且类与类之间存在父类与子类的继承关系。在实例2中String类就是Object类的子类。
简化静态初始化如下:
type[] arrayName = {element1,element2,element3,element4......}
//实例
int[] intArr = {1,2,3,4}
- 动态初始化:初始化时程序员指定数组长度,由系统为数组元素分配初始值。
arrayName = new type[length]
//实例1
int[] intArr;
intArr = new int[10]
注:静态初始化与动态初始化不可能现时使用在一个数组。
使用数组
Java语言的数组索引是从0开始的,也就是说第一个数组元素的索引值为0,最后一个数组元素的索引值是数组长度减1。如果访问数组元素时指定的索引值小于0,或者大于等于数组的长度,编译程序时不会出现任何错误,但是在运行时出现异常java.lang.ArrayIndexOutOfBoundsException:N(数组索引越界异常),N指的是程序员试图访问的数组索引。
//简单的使用数组实例1
int[] intArr //定义一个int类型的数组
intArr = new int[10] //为intArr数组动态初始化,数组元素为10个索引为0~9,默认值为0
for(int i = 0;i<10;i++){
intArr[i] = i; //为数组中索引值为0~9的数组元素赋值
}
for(int i = 0;i<10;i++)
System.out.print(intArr[i]); //输出数组中的所有元素的值
注:从Java 5之后,Java提供了一种更简单的循环:foreach循环,这种循环遍历数组和集合更加简洁,使用foreach循环遍历数组和集合元素时不需要获得数组和集合的长度,无须根据索引来访问数组元素和集合元素。
//简单的使用数组实例2
int[] intArr = new int[10];
for(int i = 0;i<10;i++)
intArr[i] = i;
foreach(int type : intArr){
//注,如果此时对type进行赋值只能改变type的值,而数组元素中的值没有变化。
System.out.print(type)
}
//实例2和实例1的功能是相同的
深入数组
数组引用变量只是一个引用,而这个引用变量可能指向任何有效的内存,只有当该引用指向有效内存后,才可通过该数组变量来访问数组元素。数组的引用变量存储在栈(stack)内存,而数组对象存储在堆(heap)内存。如下图1所示:
、
注:当堆内存中的数组对象被引用时就不会自动销毁,只有当没有引用变量指向堆内存中的数组对象是数组对象才能自动销毁。