JVM中的内存区域
- 方法区
类的存放区域。 - 栈
变量的存放区域。当我们新建一个方法的时候,就会新建一个栈,也就是一个方法就对应着一个栈。 - 堆
数组的存放区域。 - GC(垃圾回收器)
当我们创建了一个数组,但是却没有使用,那么数组的存在会占用内存,没有意义,就相当于垃圾,我们不需要了的,当JVM 的内存不够用了的时候,就会去清理这些没有被引用的对象所占用的内存空间。
数组的定义
就是当有多个 相同类型 的常量值有序 存放起来的时候,那就可以定义一个数组,就相当于excel的一列数据。数组中的索引相当于excel中一列数据中对应的行数,元素就是表格中的内容,所以我们使用的是元素,索引只是我们用来记录元素的位置的,数组中的第一个元素对应的索引是0,第二个元素对应的索引是1,以此类推。
定义的语法:数据类型[] 数组名
int[] ages;//定义一个int类型的数组,名称为args
int ages[];//这是另一种定义的方法,但是不推荐,因为要看到名称才知道是数组,只看到数据类型不能确定是数组,可读性不强。
数组的初始化
为数组分配内存,来存放数组的数据(也就是堆)
- 静态初始化
当知道元素是什么的时候就使用静态初始化
语法:数组元素类型[] 数组名 = new 数组元素类型[]{元素1,元素2,…}
//先定义后初始化
String[] s;
s = new String[]{
仙女1,仙女2,仙女3}
//定义数组的同时初始化
int[] a = new int[]{
1,2,3,4};
//简单方式,可以省略new之后的 数组元素类型[]
int[] a1 = {
1,2,3,4};
- 动态初始化
只设置数组的元素个数,数据由JVM自行生成。各数据类型的默认值如下图:
语法:数据类型[] 数组名 = new 数据类型{元素个数};
int[] ages = new int[5];//5表示元素的个数。
数组的元素的操作
- 获取元素的个数
语法:数组名.length
int[] nums = {
1,2,3,4,5};
int size = nums.length;//size等于nums数组的长度,也就是数组中有多少个元素。
- 设置数组元素
语法:数组名[索引] = 值;
int[] nums = {
1,2,3,4,5};
nums[2] = 333;//执行这个语句之后,数组就变成了{1,2,333,4,5},因为索引是从0开始的,索引为2,对应的就是第三位的数据。
- 获取数组中的元素
语法:元素类型 变量名 = 数组名[索引];
需要确定索引是否存在
int[] nums = {
1,2,3,4,5};
//获取第四个数据
int i = nums[3];//第四个数据,索引值为3.
- 为数组中的指定索引位置设值
方法一:for
int[] nums = {
1,2,3,4,5};
for (int i = 0;i < nums.length;i++){
System.out.print(nums[i]+",");
}
方法二:for-each
不会涉及到索引,使用定义的变量去接收每次变量出来的元素。
int[] nums = {
1,2,3,4,5};
for(int i:nums){
System.out.print(i);
}
- 操作数组过程中可能存在的问题和原因
NullPointerException:空指针异常(空引用异常)
操作了一个尚未初始化或者没有分配内存空间的数组
ArrayIndexOutOfBoundsException:数组的索引越界异常
操作的数组的索引不在[0,数组名.length-1]范围内
练习
- ArrayDemo1.java(重点)
需求:定义数组和数组的静态初始化操作
步骤:
(1)先定义后初始化数组(不能使用简写方式)
(2)定义数组,同时初始化
(3)打印数组长度
(4)数组赋值为空,并演示空指针错误
public class ArrayDemo1 {
public static void main(String[] args){
//先定义后初始化
int[] a;
a = new int[]{
1,2,3,4};
//定义数组同时初始化
String[] s = new String[]{
"张三","李四"};
//打印数组长度
System.out.println("数组a的长度为"+a.length);