java数组释放内存_(二十六)、Java数组在内存中如何存放与分配

  • Post author:
  • Post category:java


Java中有两种类型的数组:

基本数据类型数组;

对象数组;

当一个对象使用关键字“new”创建时,会在堆上分配内存空间,然后返回对象的引用,这对数组来说是一样的,因为数组也是一个对象。

一维数组

int[] arr = new int[3];

在以上代码中,arr变量存放了数组对象的引用;如果你创建了一个空间大小为10的整型数组,情况是一样的,一个数组对象所占的空间在堆上被分配,然后返回其引用。

8200d5f5f145e9363431e9ded46706c1.png

二维数组

那么二维数组是如何存储的呢?事实上,在Java中只有一维数组,二维数组是一个存放了数组的数组,如下代码及示意图:

int[][] arr = new int[3][];

arr[0] = new int[3];

arr[1] = new int[4];

arr[2] = new int[5];

bae83df36464bc9d0b79e08ccd2d3fa6.png

对于多维数组,道理是一样的。

Java数组是静态的

Java 语言是典型的静态语言,因此 Java 数组是静态的,即当数组被初始化之后,该数组 所占的内存空间、数组长度都是不可变的。Java 程序中的数组必须经过初始化才可使用。所谓初始化,即创建实际的数组对象,也就是在内存中为数组对象分配内存空间,并为每个数组 元素指定初始值。

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

静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。

动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。

不管采用哪种方式初始化Java数组,一旦初始化完成,该数组的长度就不可改变,Java语言允许通过数组的length属性来访问数组的长度。示例如下:

public classArrayTest{public static voidmain(String[] args) {//采用静态初始化方式初始化第一个数组

String[] books = new String[]{“1”, “2”, “3”, “4”};//采用静态初始化的简化形式初始化第二个数组

String[] names = {“孙悟空”, “猪八戒”, “白骨精”};//采用动态初始化的语法初始化第三个数组

String[] strArr = new String[5];//访问三个数组的长度

System.out.println(“第一个数组的长度: ” +books.length);

System.out.println(“第二个数组的长度: ” +names.length);

System.out.println(“第三个数组的长度: ” +strArr.length);

}

}

上面代码声明并初始化了三个数组,这三个数组的长度将会始终不变。

c4c7ab6d1d58d3dade24fb823b4599d5.png

前面已经指出,Java 语言的数组变量是引用类型的变量。

books、names 、strArr 这三个变量,以及各自引用的数组在内存中的分配示意图如图所示:



版权声明:本文为weixin_28778267原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。