数组
语法
数组的声明:
int[] ints;
数组的初始化(initialization):
- 静态初始化
ints = new int[]{};//若不放元素 默认为0 // 或者 ints = new int[]{1,2,3};
需要我们显式的赋值,数组的长度由系统完成。
- 动态初始化
ints = new int[3];//动态初始化不能不给长度,数组一定给定了长度就不能改变了。
给数组分配空间并不是分配操作系统的空间,而是分配JVM中的空间。
数组是引用数据类型。
JAM内存模型
为了更好的描述JVM内存空间,Java的开发者,在《Java虚拟机规范》中指出:JVM (运行时数据区)内存共分为JVM栈,堆,方法区,程序计数器,本地方法栈五个部分。
* NPE 空指针异常
* 因为数组的引用指向了空常量null,实际上没有数组,
* Arrays.toString();//把数组变成字符串
* 输出结果[1,2,3]
什么是引用数据类型(数组初始化的内存分配过程)
引用数据类型是Java的两个数据类型之一。引用数据类型的创建分为两部分:
-
首先在栈上(栈帧上)开辟一片空间给引用类型引用,一个变量是否被初始化都占内存空间啊。
-
然后在堆上开辟一片空间,用于存放引用数据类型具体数据信息,称之为“对象”或者实例。
-
栈上的引用是指向堆上对象的地址。
直接输出数组名:log:[数组,I数组类型 @后接16进制内存地址。数组首地址。
-
基本数据类型不存在”引用“的概念,数据都是直接存储在栈上的栈帧里;
-
堆上的变量具有默认值
-
整形(byte、short、int、long)默认值为0
-
浮点类型(float、double)默认值为0.0
-
字符类型(char)默认值是'\u0000' 空字符
-
布尔类型(boolean)默认值是false
-
引用数据类型默认值是null
-
栈上变量没有默认值,声明必须显式的初始化,否则无法使用
-
生命周期来看:
-
堆上的对象使用完毕后,就会变成“垃圾”,会等待垃圾回收器进行内存回收
- 堆上的对象变成垃圾后,并不是立刻就会被回收,而是等待垃圾回收器进行回收
- 整个垃圾回收的过程都是由Java的垃圾回收机制自动完成的,极大的节省了Java程序员的精力
- 垃圾回收是Java和C++之间的一道围墙,墙外的人想进来,墙内的人却想出去
-
栈上的局部变量的生命周期和栈帧保持一致
-
方法栈帧进栈后,局部变量就被声明分配空间了
-
方法出栈后,局部变量就被销毁了 。
-