递归
概述
递归 : 就是在当前方法中, 调用自己
基本思想 : 以此类推
递归和迭代是等价的 , 而迭代就是循环 , 所以递归也是重复做某件事
三要素 : 初始值 , 终止条件 , 步长
如果循环能做到的 , 就不要使用递归 , 因为递归效率低 , 比较耗内存
应用场景 :
一般树状结构 , 需要使用递归来完成
比如菜单目录 , 每一层目录结构都是一个循环 , 两层就需要嵌套循环 , 那么当不知道有多少层目录的时候 循环就不行了
常见异常
public static void main(String[] args){
m1();
}
pubic static void m1(){
//没有终止条件
m1();
}
数组
概述
数组 : 是引用数据类型 (类 , 接口 , 数组)
数组是底层的数据结构 , 几乎任何语言都有 , 数组被分为 索引数组 和 关联数组
数据结构
数据结构是计算机储存 、组织数据的方式 .数据结构是指相互之间存在一种或多种特定关系的数据元素的集合
数组
栈
链表
散列
二叉树 / 红黑树
应用场景
数组用来存储多个数据 , 比如单个成绩可以用一个变量存储 ,多个的话写多个变量就不合适
可以使用数组 , 来存储多个数据 , 这样一个变量就可以代替多个变量 , 方便统一操作 , 但是数组中的元素 数据类型必须一致
int i = 2;
int[] is = {1,3,5,4,789,456};
数组特性
可以看做是一个多个相同数据的一个存储容器 , 可以对这些数据进行统一管理
是一种引用数据类型
意味着 数组占用两块空间 , 栈内存 变量保存 堆内存 对象的引用
是一种线性数据结构 , 内存空间是连续的 , 类似于单元楼
数据可以保存任意数据的元素, 但是每一维的元素类型必须一致
数组的长度不能直接更改 , 也就意味着数组一旦确定就不能添加或减少
除非新建一个新的数组, 然后把原数组中的元素复制进去 ,在复制的过程中进行 添加和删除
数组中有一个 length 属性 , 保存的是数组的长度
并且数组中元素都有一个独一无二的编号(下标)
要查找数组中的某个元素的时候 , 只需要使用对应的索引下标即可 , 在数组中 0 是第一个元素的下标 , 1则是第二个元素的下标 , 以此类推
这种通过内存地址直寻法 , 效率极高
操作 : 增删改查
结合数组特性, 数组 查找和更改效率高 , 添加和删除 效率相对较低
与数组相比 , 链表的 添加和删除的效率高 , 查找和更改效率低
数组声明
静态声明 : 在知道数组每个元素的值的时候 , 使用静态声明
数据类型[] 变量 = {值,值,值,......};
int i = 5;
int[] is = {1,23,4,5,6};
int[][] is2 = {
{1,2,3,4,5}; {1,2,3,4,5}; {1,2,3,4,5}; {1,2,3,4,5}; ......};
动态声明 : 在预先不知道每个元素值是多少的时候 , 使用动态声明 , 需要提前指定数组空间长度 , 并使用默认值占位
整数 : 0
浮点 : 0.0
char : \u0000
boolean : false
引用类型 : null
数据类型[] 变量 = new 数据类型[长度];
int[] is = new int[10];
数组传递 , 第三种声明方式 静态声明
数据类型[] 变量 = new 数据类型[]{值,值,值,......};
public static void main(String[] args){
int [] arr = {1,2,3};
m1(arr);
//数组字面量传递
m1(new int[]{1,2,3});
}
public static void m1(int[] arr){
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
}
数据类型[] 变量 和 数据类型 变量[]
int[] i = {1,2,3} int i[] = {1,2,3}
数组的基本操作
获取数据(查)
//长度
System.out.println(is.length);
//首元素 索引/下标 index
//数组对象(数组变量) [下标]
System.out.println(is[0]);
//尾元素
System.out.println(is[is.length-1])
设置数据(改)
//更改操作
//数组[下标] = 值;
is[1] = 1;
遍历
int[] arr = new int[10];
arr[0] = 100;
for(int i = 0; i < arr.length; i++){
System.out.println