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内存分析:
- 栈内存:
栈内存存储的都是局部变量,方法是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量。变量有自己的作用域,一旦离开作用域,变量就会被释放。
- 堆内存:
存储的是数组和对象,凡是用
new关键字
创建的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性)。如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的。堆里的实体虽然不会被释放,但是会被当成垃圾,Java的垃圾回收机制 能不定时的收取。
- 流程图:
堆与栈的区别:
- 栈对应的是局部变量,而堆对应的是new出来的对象;
- 栈内存周期短,随数据的消失而被释放。而堆内存存放的周期长,不会随着部分数据的消失而被释放,要靠回收机制回收;
示例:
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
文章目录