java数组-----内存分析

187 阅读2分钟

数组及内存管理(java)

数组初始化

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

数组有静态初始化和动态初始化两种初始化方式。

  • 静态初始化:初始化由程序员显示指定每个数组元素的初始值,由系统判断决定数组长度。
  • 动态初始化:初始化时,程序员只给定数组的长度,由系统判断数组数据类型并赋初始默认值。 众所周知,我们的数组变量为引用的变量,像我们定义一个数组,其数组变量保存在方法栈中(main方法栈),其其变量,也就是地址指向堆内存中的数组对象。
public static void main(String[] args) {
    //即静态初始化数组
    String[] arr = {"小白","小明","小光"};
    //静态初始化
    String[] str = new String[]{"A","B","C"};
    //动态初始化
    int[] num = new int[3];
    System.out.println("第一个数组的长度"+arr.length);
    System.out.println("第二个数组的长度"+str.length);
    System.out.println("第三个数组的长度"+num.length);
}

我们需要注意java数组变量是一种引用类型的变量,数组变量并不是数组本身,她只是指向堆内存中的数组对象。因此,可以改变一个数组变量所引用的数组,这样可以造成数组长度可变的假象(比如集合框架中的ArrayList)。这就是下面要说的java数组如果要使用一定要初始化吗?

java数组一定要初始化吗?

//我们发现在没有对数组str进行初始化,而是将其指向了arr数组变量所引用的数组对象,
// 从而str变量就已经指向一个有着有效内存并且长度为3 的数组对象
String[] arr = {"小白","小明","小光"};
String[] str;
str = arr;
System.out.println("未被初始化的数组str:"+str[2]);

所以区分清楚数组变量和数组对象是至关重要的,对于数组变量来说,它并不需要所谓的初始化,只要让数组变量指向一个有效的数组对象,程序即可正常使用该数组变量。同理,我们定义的各种对象,即引用类型的数据,其对象变量中存储的仅为指向真实对象本身的一个地址(指针),对象本身才需要初始化。 2022.1.3