数组
概念:数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
数组既可以存储基本数据类型,也可以存储引用数据类型
一维数组
定义格式:
1 | 格式一:数据类型[] 数组名; |
举例:
1 | int[ ] a; //定义了一个int类型的数组a; |
案例:
1 | public class ArrayDemo { |
数组可以存储基本数据类型,也可以存储引用数据类型。
1 | public class ArrayDemo { |
Java中的内存分配以及栈和堆的区别
栈: 存放的是局部变量
局部变量:在方法定义中或者方法声明上的变量都是局部变量。
堆: 存放的是所有new出来的东西
特点:
a: 每一个new出来的东西都会为其分配一个地制值。 b: 每一个变量都有一个默认的值
1 | byte,short,int,long -------->0 |
使用完毕就变成了垃圾,等待垃圾回收器对其回收
- 方法区
- 本地方法区:(和系统相关)
- 寄存器:(cpu使用)
两个数组的内存图

三个数组的内存图

1 | 执行流程: |
数组的初始化
Java中数组必须先初始化才能使用,即为数组中的元素分配内存空间并赋值
初始化的分类:
(1)动态初始化: 只指定长度,由系统给出初始化值
(2)静态初始化: 给出初始化值,由系统决定长度
注意:两种初始化方式只能使用一种,不能动静结合
动态初始化
格式:
1 | 数据类型[] 数组名 = new 数据类型[数组长度]; |
举例:
1 | int[] arr = new int[3]; //定义了一个int类型的数组arr,这个数组可以存放4个int类型的值。 |
动态初始化的内存图解

静态初始化
格式:
1 | 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…}; |
举例: i
1 | int[] arr = new int[]{1,2,3}; |
简化格式:
1 | 数据类型[] 数组名 = {元素1,元素2,…}; |
举例:
1 | int[] arr = {1,2,3}; |
静态初始化内存图

1 | public class ArrayDemo03 { |
一维数组常用操作
数组的遍历
1 | public static void main(String[] args) { |
数组获取最值
1 | public static void main(String[] args) { |
数组反转
1 | public class ArrayDemo3 { |
数组查表法
根据键盘录入索引,查找对应星期
1 | import java.util.Scanner; |
数组基本查找
查找指定元素第一次在数组中出现的索引
1 | import java.util.Scanner; |
数组操作的两个常见小问题越界和空指针
ArrayIndexOutOfBoundsException:数组索引越界异常
每个数组的索引都有一个范围,即0~length-1。在访问数组的元素时,索引不能超出这个范围,否则程序会报错,如下所示。
1 | public class ArrayDemo06 { |
出现这个异常的原因是数组的长度为4,其索引范围为0~3,而上述代码中的第4行代码使用索引4来访问元素时超出了数组的索引范围。
NullPointerException:空指针异常
在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常
1 | public class ArrayDemo2 { |
二维数组
概念:二维数组其实就是每一个元素为一维数组的数组
定义格式:
数据类型[][] 变量名 = new 数据类型[m][n]
m表示这个二维数组有多少个一维数组 必须写上
n表示每一个一维数组的元素个数 可不写
举例:
int[][] arr = new int[3][2];
表示定义了一个二维数组arr,这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2],每个一维数组有2个元素,可以通过arr[m][n]来获取
注意事项:
(1)以下格式也可以表示二维数组:
数据类型 数组名[] [] = new 数据类型[m] [n];
数据类型[] 数组名[] = new 数据类型[m] [n];
(2)int[] x,y[]; //定义了两个数组 一个是一维数组x= new int[3],另一个是二维数组y=new int[3] []
二维数组的内存图

二维数组常用操作
二维数组遍历
1 | public static void main(String[] args) { |
打印杨辉三角
1 | public class ArrayDemo { |
递归
递归概述: 方法定义中调用方法本身的现象
递归注意事项:
- 要有出口,否则就是死递归
- 次数不能太多,否则就内存溢出
斐波那契数列
案例:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
由此可见兔子对象的数据是:1 , 1 , 2 , 3 , 5 , 8 …
1 | public class MyTest2 { |
根据索引查元素
1 | public class ArrayDemo8 { |
根据元素查索引
1 | public class ArrayDemo9 { |
在数组中查元素索引
1 | public class Test { |