1. 递归栈内存溢出原理
package day01;
/*
递归:方法自己调用自己
- 递归的分类:
- 递归分为两种,直接递归和间接递归
- 直接递归称为方法自身调用自己
- 简介递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法
- 注意事项:
- 递归一定要有条件限定,保证递归能够停下来,否则会发生栈内存溢出
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生内存溢出
- 构造方法,禁止递归
递归使用前提:
当调用方法的时候,方法的主体不变,每次调用方法参数不同,可以使用递归
*/
public class Dmeo01Recurison {
}
2. 递归计算1-n之间的和
package day01;
/*
练习:
使用递归计算1-n之间的和
*/
public class Demo02Recurison {
public static void main(String[] args) {
System.out.println(sum(3));
}
/*
定义一个方法,使用递归计算1-n之间的和
1+2+3+...+n
n+(n-1)+(n-2)+...+1
已知:
最大值:n
最小值:1
使用递归必须明确:
1.递归的结束条件
获取到1的时候结束
2.递归的目的
获取下一个被加的数字(n-1)
*/
public static int sum(int n) {
//获取到1的时候结束
if (n == 1) {
return 1;
}
//获取下一个被加的数字(n-1)
return n + sum(n-1);
}
}
递归1-n的阶乘
package day01;
/*
联系:
使用递归计算阶乘
n的阶乘:n! = n*(n-1)*(n-2)*...*3*2*1
5的阶乘
*/
public class Demo03Recurison {
public static void main(String[] args) {
System.out.println(jc(5));
}
public static int jc(int n){
if (n==1){
return 1;
}
return n*jc(n-1);
}
}
递归遍历多级文件
package day01;
import java.io.File;
import static day01.Demo04Recurison.getAllFile;
public class Demo04Recurison {
public static void main(String[] args) {
File file = new File("D:\\liuqian\\java_project\\src");
getAllFile(file);
}
public static void getAllFile(File file){
File[] f = file.listFiles();
for (File file1 : f) {
if (file1.isDirectory()){
//file1 是一个文件夹,则继续遍历这个文件夹
//我们发现getFileAll方法就是传递文件夹,遍历文件夹的方法
//所以直接调用getFileAll方法即可:递归(自己调用自己)
getAllFile(file1);
}else{
System.out.println(file1);
}
}
}
}
package day02;
import java.io.File;
/*
练习:
递归打印多级目录
需求:
遍历c:\\abc文件夹,及abc文件夹的子文件
只要。java结尾的文件
*/
public class Demo01Recurison {
public static void main(String[] args) {
File file = new File("D:\\liuqian\\java_project\\src");
getAllFile(file);
}
public static void getAllFile(File file){
File[] f = file.listFiles();
for (File file1 : f) {
if (file1.isDirectory()){
//file1 是一个文件夹,则继续遍历这个文件夹
//我们发现getFileAll方法就是传递文件夹,遍历文件夹的方法
//所以直接调用getFileAll方法即可:递归(自己调用自己)
getAllFile(file1);
}else{
String s = file1.toString();
boolean b = s.endsWith(".java");
if (b){
System.out.println(file1);
}
}
}
}
}
文件过滤器
package day02;
import java.io.File;
/*
需求:
遍历D:\liuqian\java_project\src文件夹,及abc文件夹的子文件夹
只要.java结尾的文件
我们可以使用过滤器实现
在File类中有两个和ListFiles重载的方法,方法的参数传递的就是过滤器
File[] ListFiles(FileFilter filter)
java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器。
作用:用来过滤文件(File对象)
抽象方法:用来过滤文件的方法
boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。
参数:
File pathname:使用ListFiles方法遍历目录,得到的没有给文件对象
File[] listFiles(FilenameFilter filter)
java,io.FilenameFilter接口:实现此接口的类实例可以用于过滤器文件名
作用:过滤文件名称
抽象方法:用来过滤文件的方法
boolean accept(File dir,String name) 测试指定文件是否应该包含在某一文件列表中
参数:
File dir:构造方法中传递的被遍历的目录
String name :使用ListFiles方法遍历目录,获取没有给文件/文件夹的名称
注意:
两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则
*/
public class Demo01Filter {
public static void main(String[] args) {
File file = new File("D:\\liuqian\\java_project\\src");
getAllFile(file);
}
public static void getAllFile(File file){
File[] f = file.listFiles(new FileFilterImpl());
for (File file1 : f) {
if (file1.isDirectory()){
//file1 是一个文件夹,则继续遍历这个文件夹
//我们发现getFileAll方法就是传递文件夹,遍历文件夹的方法
//所以直接调用getFileAll方法即可:递归(自己调用自己)
getAllFile(file1);
}else{
String s = file1.toString();
boolean b = s.endsWith(".java");
if (b){
System.out.println(file1);
}
}
}
}
}
package day02;
import java.io.File;
import java.io.FileFilter;
public class FileFilterImpl implements FileFilter{
@Override
public boolean accept(File pathname){
/*
过滤规则:
在accept方法中,判断File对象是否以.java结尾
是就返回true
不是就返回false
*/
//如果pathname是一个文件夹,返回true,继续遍历这个文件夹
if (pathname.isDirectory()){
return true;
}
return pathname.getName().toLowerCase().endsWith(".java");
}
}
package day02;
import java.io.File;
import java.io.FilenameFilter;
/*
需求:
遍历D:\liuqian\java_project\src文件夹,及abc文件夹的子文件夹
只要.java结尾的文件
我们可以使用过滤器实现
在File类中有两个和ListFiles重载的方法,方法的参数传递的就是过滤器
File[] ListFiles(FileFilter filter)
java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器。
作用:用来过滤文件(File对象)
抽象方法:用来过滤文件的方法
boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。
参数:
File pathname:使用ListFiles方法遍历目录,得到的没有给文件对象
File[] listFiles(FilenameFilter filter)
java,io.FilenameFilter接口:实现此接口的类实例可以用于过滤器文件名
作用:过滤文件名称
抽象方法:用来过滤文件的方法
boolean accept(File dir,String name) 测试指定文件是否应该包含在某一文件列表中
参数:
File dir:构造方法中传递的被遍历的目录
String name :使用ListFiles方法遍历目录,获取没有给文件/文件夹的名称
注意:
两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则
*/
public class Demo02Filter {
public static void main(String[] args) {
File file = new File("D:\\liuqian\\java_project\\src");
getAllFile(file);
}
public static void getAllFile(File file){
//使用匿名内部类
File[] f = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// 过滤规则,pathname是文件夹或者是.java结尾的文件返回true
return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java"); //这里是listFiles返回file中的所有文件夹,再利用过滤器里里面的抽象方法过滤
}
});
for (File file1 : f) {
if (file1.isDirectory()){
//file1 是一个文件夹,则继续遍历这个文件夹
//我们发现getFileAll方法就是传递文件夹,遍历文件夹的方法
//所以直接调用getFileAll方法即可:递归(自己调用自己)
getAllFile(file1);
}else{
String s = file1.toString();
boolean b = s.endsWith(".java");
if (b){
System.out.println(file1);
}
}
}
}
}