一、数组初始化
1.静态初始化
(1)完整格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,元素4...};
(2)简写格式:
数据类型[] 数组名 = {元素1,元素2,元素3,元素4...};
(3)地址值
打印数组的时候,实际出现的是数组的地址值。
int[] arr = {1,2,3,4,5};
System.out.println(arr);//地址值:[I@6d03e736
(4)扩展
以[I@6d03e736为例:
[ :表示现在打印的是一个数组。
I:表示现在打印的数组是int类型的。
@:仅仅是一个间隔符号而已。
6d03e736:就是数组在内存中真正的地址值。(十六进制的)
(5)数组的长度属性
调用方式:数组名.length
快速生成数组的遍历方式
仅由idea提供------>数组名.fori
2.动态初始化
(1)初始化
初始化时只指定数组长度,有系统为数组分配初始值
(2)格式
数据类型[] 数组名 = new 数据类型[数组的长度];
(3)数组的默认初始化值:
整数类型:0
小数类型:0.0
布尔类型:false
字符类型:‘\u0000’
引用类型:null
3.二维数组
(1)静态初始化
简化:数据类型[][] 数组名 = {{…},{…}};
(2)动态初始化
数据类型[] [] 数组名 = new 数据类型[长度] [长度]
(3)内存分配
与一维数组一样,用到栈内存和堆内存
可以分解成,先创建一维数组,一维数组作为元素再创建数组,此时成功创建二维数组
二、Java内存分配
1.栈
(1)作用
方法运行时使用的内存,比如main方法运行,进入方法栈中执行
(2)变量
定义一个变量,使用栈内存
2.堆
(1)作用
存储对象或数组,new来创建的(在堆里开辟地址空间),都存储在堆内存
(2)数组存储
用到栈内存和堆内存,栈内存存储的是在堆里开辟的地址空间的地址,堆内存里存储数组的具体内容,包括元素,数组长度等
(3)数组存储的特殊情况
两个数组指向同一个空间的内存
public static void main(String[] args){
int[] arr1 = {11,22};//在堆里面开辟地址空间,且存入数据
int[] arr2 = arr1;//表示arr1中的内容赋值给arr2,arr1和arr2指向同一个堆内存的地址空间
sout(arr1[0]);//11
sout(arr2[0]);//11
arr2[0] = 33;//33赋值给arr2[0]的地址空间
sout(arr1[0]);//33
sout(arr2[0]);//33
}
两个数组指向同一个空间的内存,当一个数组对地址空间中的值进行修改,那么其他数组再访问时,获取的数据则是修改后的数据
3.方法区(元空间)
JDK8开始,取消方法区,新增元空间。把原来方法区的多种功能进行拆分,有的功能放到了堆中,有的功能放到了元空间中
作用
存储可以运行的class文件
4.本地方法栈
作用
JVM在使用操作系统功能的时候使用,和开发者无关
5.寄存器
作用
给CPU使用,和开发者无关