Java数组的三种初始化

  • 静态初始化: 在数组的定义时就为数组分配空间并给每个元素赋值;

    int[] nums = {1,2,3,4,5} // 声明时就直接分配长度并为每个元素赋值
  • 动态初始化: 数组的定义和数组元素的赋值分开进行。也就是先使用 new 关键字分配内存空间,再根据下根给数组元素赋值。

    int[] nums = new int[10] ;
    int[0] = 1;
    int[9] = 10;
  • 默认初始化

    前面说过,数组也是一种数据引用类型,数组变量并不是数组本身。数组变量是成员变量,因此数组一旦在内存被分配空间,每个数组元素就会被隐性的赋上默认值,也就是按数据类型默认值初始化。

    int[] nums = new int[10];
    system.out.println(nums[0]);
    system.out.println(nums[0]);
    
    //输出 
    0
    0
    int 是 0; float, double 是 0.0; string 是 null, boolean 是false 。
  • 数组是否必须初始化

    对于这个问题,关键在于要弄清楚数组变量数组对象的差别。

    • 数组对象是存放在堆内存中的。
    • 数组变量是存放在栈内存中的。
    数组变量只是一个引用变量,他能够指向实际的数组对象。

因创建时用到关键字 new一个实体,是存在堆里的,可以这么理解:

所谓的数组初始化并非对数组变量的初始化,而是对数组对象进行初始化

Java内存分析:

Java数组详解03 - 三种初始化及内存分析

  • 栈内存:

    栈内存存储的都是局部变量,方法是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量。变量有自己的作用域,一旦离开作用域,变量就会被释放。

  • 堆内存:

    存储的是数组和对象,凡是用new关键字创建的都是在堆中堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性)。

    如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的。堆里的实体虽然不会被释放,但是会被当成垃圾,Java的垃圾回收机制 能不定时的收取。

  • 流程图

    Java数组详解03 - 三种初始化及内存分析

堆与栈的区别:

  1. 栈对应的是局部变量,而堆对应的是new出来的对象;
  2. 栈内存周期短,随数据的消失而被释放。而堆内存存放的周期长,不会随着部分数据的消失而被释放,要靠回收机制回收;

示例:

package com.zctou.array;

public class ArrayDemo02 {
    public static void main(String[] args) {
        // Java的三种初始化分析
        // 1. 静态初始化: 声明时直接创建数组,并为每个数组元素赋值
        int[] nums1 = {1,2,3,4,5,8} ;
        printArray(nums1);

        // 2. 动态初始化: 创建,赋值分开进行,并不在创建时直接给所有数组元素赋值
        int[] nums2 = null ;
        nums2 = new int[6];
        // 相当于 int[] nums2 = new int[10];
        nums2[0] = 1; //只给部分数组元素赋值
        nums2[2] = 3;
        printArray(nums2);

        // 3. 默认初始化: 数组在new出来的时候,所有数组元素会被初始化
        //               根据不同的数据类型,赋予不同的默认值
        double[] numsd1 = new double[5] ; //double 默认值:0.0
        printArray(numsd1);
        String[] s1 = new String[3]; //string 默认值:null
        printArray(s1);
        boolean[] b1 = new boolean[4]; //boolean 默认值: false
        printArray(b1);

    }

    public static void printArray(boolean[] bs) {
        System.out.print("打印数组有" + bs.length + "个数组元素: ");
        for (boolean s : bs) {
            System.out.print(s + ",");
        }
        System.out.println();
    }

    public static void printArray(String[] strs) {
        System.out.print("打印数组有" + strs.length + "个数组元素: ");
        for (String s : strs) {
            System.out.print(s + ",");
        }
        System.out.println();
    }

    public static void printArray(double[] nums) {
        System.out.print("打印数组有" + nums.length + "个数组元素: ");
        for (double n : nums) {
            System.out.print(n + ",");
        }
        System.out.println();
    }

    public static void printArray(int[] nums) {
        System.out.print("打印数组有" + nums.length + "个数组元素: ");
        for (int n : nums) {
            System.out.print(n + ",");
        }
        System.out.println();
    }

}

输出:

打印数组有6个数组元素: 1,2,3,4,5,8, //静态初始化
打印数组有6个数组元素: 1,0,3,0,0,0, //动态初始化
打印数组有5个数组元素: 0.0,0.0,0.0,0.0,0.0, //默认初始化,int默认是0
打印数组有3个数组元素: null,null,null, //string 默认是 null
打印数组有4个数组元素: false,false,false,false, // boolean 默认是 false
文章目录