当前位置: 代码迷 >> 综合 >> java 数组及其内存管理
  详细解决方案

java 数组及其内存管理

热度:58   发布时间:2024-01-26 06:39:29.0

创建数组的过程中,内存是如何分配的?

java 数组的初始化一共有哪几种方式?

。。。。。。

一系列的问题让我们对数组开始了探究

数组的初始化

java 数组是静态的,即当数组被初始化后,该数组所占的内存空间、数组长度都是不可变的。

数组的初始化有两种方式:

(1)静态初始化:初始化时由我们指定每个数组的初始值,由系统决定数组长度

(2)动态初始化:由我们指定数组长度,系统分配初始值

如下:

public class test1 
{public static void main(String[] args) {//静态初始化方式1  初始数组String[] books = new String[]{"第一行代码","java","spring","mybatis"};//静态方法初始化数组2 String[] names = {"zhangsan","lishi","wangmazi"};//动态方式初始化数组String[] strArr = new String[5];//访问三个数组的长度System.out.println("第一个数组的长度" + books.length);System.out.println("第二个数组的长度" + names.length);System.out.println("第三个数组的长度" + strArr.length);}}

输出结果:

第一个数组的长度4
第二个数组的长度3
第三个数组的长度5

注意:不要同时使用静态初始化和动态初始化,就是不要既指定数组长度,又为每个元素分配初始值。 

数组初始化完成后,数组元素的内存空间分配结束,程序只能改变数组元素的值,而无法改变数组长度

例:

//让books数组变量、strArr数组变量指向 names 所引用的数组
books = names;
strArr = names;System.out.println("=================");
System.out.println("books数组的长度:" + books.length);
System.out.println("strArr数组的长度:" + strArr.length);

输出结果

=================
books数组的长度:3
strArr数组的长度:3

此时看到输出结果为3,通常会觉得 books数组从4变成了3。实际上,数组长度并没有改变,只是books 数组变量发生了改变 ,执行 books=names 后数组变量改为指向names所指向的数组,原来的books变成了垃圾长度依然是4,但没有别的变量引用该数组。 

数组一定要初始化吗?

对于数组变量来说,他不需要所谓的初始化,只要让数组变量指向一个有效的数组对象,程序就可以正常使用该数组变量

public static void main(String[] args){//定义一个数组变量int[] nums;//初始化数组nums = new int[] {2,4,8,10};//数组长度System.out.println("数组长度:" + nums.length);//打印数组for(int i = 0; i<nums.length; i++){System.out.print(nums[i]+" ");}}

执行 int[] nums时,数组并未指向有效的内存,只是一个数组变量,此时还不能使用该数组对象。当执行 nums = new int[] {2,4,8,10}; 后系统会根据指定的元素来决定数组的长度,数组的长度指定过后是不能改变的,只能改变数组元素的值。 

 

数组的内存分配机制,理解下面的这个程序

public static void main(String[] args){//初始化一个Object 数组Object[] obj = new Object[4];		//让obj所引用的数组的第二个元素再次指向另外一个数组obj[1] = new Object[3];		//将obj[1]的值赋给obj2,就是让obj2和obj[1]指向同一个数组对象Object[] obj2 = (Object[]) obj[1];		//让obj2所引用的数组的第二个元素再次指向另外一个数组obj2[1] = new Object[4];		//将obj2[1]的值赋给obj3,就是让obj3和obj2[1]指向同一个数组对象Object[] obj3 = (Object[]) obj2[1];		//让obj3所引用的数组的第二个元素再次指向另外一个数组obj3[1] = new Object[5];//依次为obj数组每个元素赋值for(int i = 0; i<obj3.length; i++){obj[i] = i*2;//(0,2,4,......)}//直接通过obj访问obj3数组的第3个元素System.out.println(obj[2]);					}

输出:

4