数组与内存控制1
Java的数组是静态的,即当数组被初始化之后,该数组的长度是不可变的。Java程序中的数组必须经初始化才可以使用.所谓初始化,就是为数组对象的元素分配内存空间,并为每个数组元素指定初始值.
数组的初始化有以下两种方式:
(1) 静态初始化:初始化时由程序员显式指定每个数组元素的初始值,有系统决定数组长度.
(2) 动态数组初始化:初始化时程序员只指定数组长度,由系统为数组分配初始值.
不管采用哪种方式初始化java数组,一旦初始化完成,该数组的长度就不可改变
public class ArrayTest_01 {
public static void main(String[] args) {
//采用静态初始化方式初始化第1个数组
String[] books = new String[]{
"javaoop",
".netoop",
"javaweb",
"sqlserver"
};
//采用静态初始化简化形式方式初始化第1个数组
String[] names={
"孙悟空",
"猪八戒",
"白骨精"
};
//采用动态初始化的语法初始化第3个数组
String[] strArr = new String[5];
//访问3个数组的长度
System.out.println("第1个数组的长度:" + books.length);
System.out.println("第2个数组的长度:" + names.length);
System.out.println("第3个数组的长度:" + strArr.length);
}
}
Java语言的数组变量是引用类型的变量,上例的内存示意图:
对于静态初始化方式而言,程序员无需要指定数组长度,指定该数组的数组元素,由系统来决定该数组的长度即可。执行动态初始化时,程序员只需指定数组长度,即为每个数组元素指定所需的内存空间,系统将负责为这些数组元素分配初始值(整数类型->0,浮点类型->0.0,字符类型->’u\0000’,布尔类型->false,引用类型)
不要同时使用静态初始化和动态初始化。也就是说,不要在进行数组初始化时,即指定数组的长度,也为每个数组元素分配初始值.
public class ArrayTest_02 {
public static void main(String[] args) {
//采用静态初始化方式初始化第1个数组
String[] books = new String[]{
"javaoop",
".netoop",
"javaweb",
"sqlserver"
};
//采用静态初始化简化形式方式初始化第1个数组
String[] names={
"孙悟空",
"猪八戒",
"白骨精"
};
//采用动态初始化的语法初始化第3个数组
String[] strArr = new String[5];
//让book数组变量、strArr数组变量指向names所引用的数组
books = names;
strArr = names;
System.out.println("--------------");
System.out.println("books数组的长度:" + books.length);
System.out.println("strArr数组的长度:" + strArr.length);
//改变books数组变量所引用的数组的第2个元素值
books[1] = "唐僧";
System.out.println("names数组的第二个元素是:" + books[1]);
}
}
答案:
--------------
books数组的长度:3
strArr数组的长度:3
names数组的第二个元素是:唐僧
strArr
|
从上面程序中可以发现,books数组变量,strArr数组变量都指向names数组变量所引用的数组,这样做的结果是books、strArr、names着3个变量引用同一个数组对象,见图.
这很容易造成一种假象:books数组的长度有4变成了3。实际上,数组对象本身的长度并没有发生变化,变的是books数组变量,从图中发现books变量所引用的数组的长度依然是4,但是不再有任何引用变量引用该数组,因此它将会变成垃圾,等着垃圾回收机制来回收.
本文转载于:王伟老师的空间文章 ,一切版权归王伟老师所有