一、数组的两种初始化方式
1.完整格式(静态初始化)
数据类型[] 数组名 = new 数据类型[]{元素1,元素2…};
//范例 int[] arr = new int[]{1,2,3,4};
简化书写
一般我们会省略=后面的 new 数据类型[]
int[] arr = {1,2,3,4};
2.动态初始化
当不知道数组里面的初始值的时候,我们就要采用动态初始化
//申请一个长度为10的int类型的数组 int[] arr = new int[10];
区别:
动态初始化的数组有初始值
整数 -> 0 浮点数 -> 0.0 引用数据类型 -> null
布尔 -> false 字符型 -> 0
静态初始化不带长度,(自动计算)
二、数组的遍历方式
通过索引循环遍历
int[] arr = {1,2,3,4}; for(int i = 0; i<arr.length(); i++){ System.out.println(arr[i]); }
当然还有别的方法,我们先混个眼熟
//增强for,对于数组来说,本质与普通for相同 for (int i : arr) { System.out.println(i); } //以字符串的形式展示 System.out.println(Arrays.toString(arr));
三、数组的开辟与访问
开辟:在堆上开辟一块新空间,将地址返回给数组名
访问:数组名[索引]
四、数组的注意事项
1.数组直接打印打印的是地址值
System.out.println(arr)打印的就是arr的地址值,因为地址也是一个数嘛 printf就是负责打印
2.数组在内存图中的位置
定义数组是通过new关键字,new关键字定义的所有对象都是在堆上开辟空间的
所以下面的结果是什么 是true还是false
int[] arr1 = {1,2,3}; int[] arr2 = {1,2,3};
arr1 == arr2 // true or false ???
比较的是地址值为false
3.数组一旦开辟了空间长度是不可变的
虽然java弱化了指针与地址的概念,但是C的内存机制是最基础最底层的原理
4.区分数组长度为0 和 数组 == null的概念
数组长度为0 是指定义了一个长度为0的数组
数组 == null是指数组的地址为null,也就是空指针
5.理解数组越界的概念
从内存的角度理解数组越界的概念
五、java内存分配
栈:方法运行会加载进栈,局部变量会在栈上开辟空间
堆:使用new关键字创建的对象,都在这开辟空间
方法区:存储class文件
寄存器与本地方法栈:我们暂时不需要了解
一个简单的java程序,运行时的内存图
①加载Test2 class文件到本地方法区
②main方法为主入口,main方法进栈
③调用show方法,show方法进栈
④show调用完出栈
④为变量a在栈上开辟空间
⑤输出a
六、总结
数组何时用动态初始化、何时用静态
数组是在哪里开辟空间的
数组名==数组名比较的是什么