目录
1.方法递归
定义:方法自己调用自己的过程叫方法递归。(注意方法的语义)
使用场景:a) 一个大问题可以拆分为若干个子问题。
b) 原问题和子问题除了数据规模不一样外,求解思路完全一样。
c) 存在递归终止条件,即问题的出口。
1.1例子:用递归实现5!
(1)用逆向思维求解,要求factor(5),先求factor(4) ,以此类推。
(2)factor(5) = 5 * factor(4) 这样推下去,要先求出factor(1)。
public static void main(String[] args) {
int num = 5;
System.out.println(factor(num));
}
//写一个递归函数实现5!
//注意方法的语义
public static int factor(int num){
//先写终止条件
if (num == 1){
return num;
}
return num * factor(num - 1);
}
2.数组
2.1数组的定义:
数组的本质就是能 "批量" 创建相同类型的变量,即数组中包含的变量必须是 相同类型。
注意:数组是顺序表结构。
2.2数组的创建和初始化
动态初始化:
数据类型[] 数组名称 = new 数据类型 [] { 初始化数据 };
静态初始化:
数据类型[] 数组名称 = { 初始化数据 };
//定义一个长度为三的数组
int[] arr = new int[3];
int[] arr1 = new int[]{1,2,3};
int[] arr3 = {1,2,3};
注意事项: 静态初始化的时候, 数组元素个数和初始化数据的格式是一致的
2.3数组的使用
int[] arr = new int[3];
int[] arr1 = new int[]{1,2,3};
int[] arr3 = {1,2,3};
System.out.println(arr.length);//获取数组长度
System.out.println(arr1[1]);
System.out.println(arr1[0]);
System.out.println(arr1[arr3.length]); //数组访问越界
1. 使用 arr.length 能够获取到数组的长度. . 这个操作为成员访问操作符. 在面向对象中会经常用到.
2. 使用 [ ] 按下标取数组元素. 需要注意, 数组的下标都是从 0 开始。
3. 使用 [ ] 操作既能读取数据, 也能修改数据.
4. 下标访问操作不能超出有效范围 [0, length - 1] , 如果超出有效范围, 会出现下标越界异常。
2.4数组的遍历
定义;是指将数组中的所有元素依次都访问一遍, 不重不漏.
简单for循环遍历:
int[] arr = new int[]{1,2,3};
//取出数组元素并打印
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
for-each循环:
语法:for(临时变量,数组名称)
for (int i : arr ) {
System.out.print(i + ",");
}
当只需要访问数组元素,但不修改的情况下,可以使用for-each循环。mei'zou'yi
2.5数组作为方法的参数
(1)值传递:swap方法只是将main方法中的a,b的值拷贝一份。
public static void main(String[] args) {
int a = 10;
int b = 20;
swap(a,b);
System.out.print(a + "," + b);
}
//方法实现值传递
public static void swap(int a, int b){
int tmp = b;
b = a;
a = tmp;
}
(2)借助数组交换数字:借助数组交换数字时,int[] arr1 中的arr1存储的是数组的地址(起始位置的地址)
public static void main(String[] args) {
int[] arr1 = new int[]{10,20};
swap(arr1);
System.out.print(arr1[0] + "," + arr1[1]);
}
public static void swap(int[] arr1){
int tmp = arr1[0];
arr1[0] = arr1[1];
arr1[1] = tmp;
}
注意:(1)程序中的所有数据在内存中保存。
(2)当传参的时候, 是按在函数内部修改数组内容, 函数外部也发生改变。
(3) 所谓的 "引用" 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续 进行数组参数传参, 其实只是将数组的地址传入到函数形参中。
(4)有new就有新空间。
2.6认识 null
定义:null 在 Java 中表示 "空引用" , 也就是一个无效的引用
当一个引用变量被赋值为null时,表示此变量不保存任何地址,因此无法使用该变量进行操作。
一旦尝试读写, 就会抛出 NullPointerException.
3.JAVA中的内存划分(栈,堆)
3.1栈空间:
保存的是函数中局部变量(包括方法中的形参和实参)
public static void 方法名称(方法参数-形参){
int a = 10; // (实参)
}
3.2堆空间:
所有new的对象都在堆空间
栈和堆的存储方式如下: