这里学习了一维数组和二维数组, 数组可以存放同种数据类型的多个值.
数组
数组定义格式
数组的初始化
动态初始化: 只给定长度,由系统给出初始化值.
数据类型[] 数组名 = new 数据类型[数组的长度];
int[] arr = new int[10];- []代表的是数组,几个中括号就表示几维数组
- 整数类型: byte、short、int和long默认初始化值是0
- 浮点类型: float和double默认初始化值是0.0
- 布尔类型: boolean默认初始化值是false
- 字符类型: char默认初始化值是’\u0000’
- 引用类型: 初始化都为null
- 静态初始化: 给出初始化值,由系统决定长度.
//方式一: 一般格式, 可以先声明后赋值.
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,…};
//方式二(常用): 简化格式, 声明和赋值必须一起.
数据类型[] 数组名 = {元素1, 元素2,元素3,…};
访问数组: arr[0]
- 打印数组: [I@20ab85f
- [ 代表数组,几个表示几维
- I 代表类型 Int
- @ 固定值
- 20ab85f 数组在内存中的地址
数组注意
- ArrayIndexOutOfBoundsException,数组索引越界异常
- 访问了不存在的索引(下标、角标)
int[] arr = new int[]{1,2,3,4};
arr[10] = 10; //越界
- 访问了不存在的索引(下标、角标)
- NullPointerException, 空指针异常
- 数组已经不在指向堆内存了, 但是还是访问了数组
int[] arr = new int[5];
arr = null;
arr[10] = 10; //空指针
- 数组已经不在指向堆内存了, 但是还是访问了数组
数组的操作
- 数组的遍历
- 数组有一个属性length,表示数组的长度
int[] arr = {1,2,3,4,5,6};
for (int i = 0;i < arr.length ;i++ ) {
System.out.println(arr[i]);
}
- 获取数组中的最大值和最小值
//获取最大值
int[] arr = {1,2,3,4,5,6};
int max = arr[0];
for (int i = 1;i < arr.length ;i++ ) {
if (max < arr[i]) {
max = arr[i];
}
}
- 数组反转
int[] arr = {123,456,789,1,9};
int i = 0;
int j = arr.length - 1;
while (i < j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
- 根据下标访问元素
- arr[i]
二维数组
二维数组的定义
格式1
int[][] arr = new int[4][3]; //二维数组,有4个一维数组,每个一维数组中有3个元素, 都已经初始化
int[] arr1[] = new int[4][3];
int[] arr3,arr4[]; //arr3是一维数组,arr4是二维数组格式2
int[][] arr = new int[3][];
- 这个二维数组里面有三个一维数组,每个一维数组都没有赋值是null.
- 这个有个好处就是: 每个一维数组的可以赋值不同的值.
- 格式3
int[][] a213 = { {1,2,3}, {4,5}, {6,7,8,9} };
- hexo这里格式有个BUG不能连续写两个{ {, 解决办法: 中间加个字符,空格就行.
arr : 访问二维数组
- [[I@67064 打印二维数组
- arr[0] : 访问二维数组中第一个一维数组
- arr[0][0] : 访问二维数组中第一个一维数组中的第一个元素
- 遍历 : 需要双重循环
Java内存分配
- 栈
- 存储局部变量
- 先进后出
- 堆
- 存储new出来的数组或者对象
- 方法区
- 代码等
- 常量池
- 本地方法区
- 系统相关
- 寄存器
- CPU使用
Java方法中的参数传递问题
- 基本数据类型
- 不会改变原始值, 方法中是局部变量,出栈后消失
- 引用数据类型
- 传递的是指针地址值,修改后会变化. 即使方法出栈,堆内存中的对象还是存在的.