一、一维数组
1.数组定义格式
概念:数组(array)是一种用于存储多个相同类型数据的存储模型
数组的定义格式:
(1)格式1:数据类型[ ] 变量名,例如:int [ ] arr。定义了一个int类型的数组,数组名是arr。(2)格式2:数据类型 变量名[ ], 例如:int arr[ ]。定义了一个int类型的变量,变量名是arr数组。
2. 数组静态初始化
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
格式1:数据类型 [ ] 变量名 = new 数据类型[ ] {数据1, 数据2, 数据3, …}
int [ ] arr = new int[ ] {1, 2, 3};
格式2:数据类型 [ ] 变量名 = {数据1, 数据2, 数据3, …}
int [ ] arr = {1, 2, 3};
3.数组动态初始化
动态初始化:初始化时只指定数组长度,由系统分配默认初始化
动态初始化格式:数据类型 [ ] 变量名 = new 数据类型[数组长度]
public class ArrayDemo{
public static void main(String[] args){
int[] arr = new int[3];
/*
左边:
int:说明数组中的元素是int类型
[]:说明这是一个数组
arr:这是数组的名称
右边:
new:为数组申请内存空间
int:说明数组中的元素类型是int类型
[]:说明这是一个数组
3:数组长度,其实就说数组中的元素个数
}
}
3.java中内存分配(内存分配)
方法区:字节码文件加载时进入的内存,字节码文件(.class)由java源文件(.java)编译而成。
栈内存:方法运行时所进入的内存,也就是存储局部变量,定义在方法中的变量,使用完之后立刻弹出。
堆内存:存储new出来的内容(实体,对象),new出来的东西会在这块内存中开辟空间并产生地址。使用完毕,地址会被回收。
(1)例子1(静态数组/引用传递)
JVM自动寻找main方法,执行第一句代码,创建一个int型的静态数组arr,在栈中分配一块内存,存放一个指向堆区对象的指针0x10f87f48,由于是静态数组可以直接指定每个数组元素的初始值
执行第二句代码:根据arr指向的地址修改arr[0]的值为44
执行第三句代码:根据arr指向的地址修改arr[1]的值为55
执行第四句代码:根据arr指向的地址修改arr[2]的值为66
执行第四句代码:根据arr指向的地址输出arr[0]的值为44
执行第五句代码:根据arr指向的地址输出arr[1]的值为55
执行第六句代码:根据arr指向的地址输出arr[2]的值为66
执行完毕栈内存中所有变量弹出
(2)例子2(值传递)
JVM自动寻找main方法,执行第一句代码,创建一个int型的变量number,在栈中分配一块内存:int number = 100
执行第二句代码,打印语句:调用chang方法前:100
执行第三句代码,调用change方法,压入change(number),为change函数开辟一个新的栈内存空间
change方法是含形参的,形参对于内存而言是变量,而变量在内存中占有空间。因此change方法里面创建一个int型的变量number, 在栈中分配一块内存:int number = 100,此时number是由main里面接收而来。
接下来走change函数里面的逻辑,change里面将number修改为200
change(number)使用完毕没有逻辑了,弹栈消失
继续执行,打印语句,仍是主方法中的number值
所有逻辑完成,main弹栈消失
(3)例子3(利用返回值修改值传递)
1.JVM自动寻找main方法,执行第一句代码,创建一个int型的变量number,在栈中分配一块内存:int number = 100
2.执行第二句代码,打印语句:调用chang方法前:100
3.执行第三句代码,调用change方法,压入change(number),为change函数开辟一个新的栈内存空间
4.change方法是含形参的,形参对于内存而言是变量,而变量在内存中占有空间。因此change方法里面创建一个int型的变量number, 在栈中分配一块内存:int number = 100,此时number是由main里面接收而来。
5.接下来走change函数里面的逻辑,change里面将number修改为200,并且返回number值,此时main里面的number值被修改为2006. 接下来走change函数的逻辑已经结束,弹栈消失
7. 继续执行,打印语句,打印主方法中的number值,此时的number值由于change的返回值已经变成了200
8. 所有逻辑完成,main弹栈消失
4.数组常见两种异常