Android 递归栈溢出问题解决

首先区别下栈溢出和堆溢出:

  • 我们知道在方法栈中存放着对象调用的引用,栈是有一定深度(长度)的,如果递归调用超过了栈的深度就会触发栈溢出。

  • 而堆内存存放着new出来的对象,如果堆内存区域满了则会引发内存溢出

举个场景,我们在遍历sdcard文件的时候会用到递归,这里如果文件路径深的话就很有可能出现栈溢出,对于此问题的解决方法也很简单,就是不用递归,改为循环。

首先看看我们正常的递归操作:

public static void RecursiveTraversal(String path){
    File file = new File(path);
    file[] files = file.listFile();
    if(files == null){
        return;
    }
    int length = files.length();
    for(int i=0; i < length; i++){
        if(files[i].isDirectory()){
            //递归调用
            RecursiveTraversal(files[i].getAbsolutePath());
        } else {
            //do other...
        }
    }
}

那我们不用递归,改用循环来处理如下:

public static void RecursiveTraversal(String path){
    List<File> fileList = new ArrayList<File>();
    fileList.add(new File(path));
    while(!fileList.isEmpty()){
        File file = fileList.remove(0);
        file[] files = file.listFile();
        if(files == null){
            return;
        }
        int length = files.length();
        for(int i=0; i < length; i++){
            if(files[i].isDirectory()){
            //将需要再次遍历的文件添加至list中
            fileList.add(files[i]);
            } else {
            //do other...
            }
        }
    }

}

先将需要遍历的文件加入list中,然后遍历此list,如果文件为目录则继续添加至list,移除非目录文件,这样不停循环此list,知道没有元素为止,成功的避免了栈溢出问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二竹本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值