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

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

*
而堆内存存放着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,知道没有元素为止,成功的避免了栈溢出问题。

技术
©2019-2020 Toolsou All rights reserved,
Django个人博客搭建教程---时间分类归档你不知道的鸿蒙——HarmonyOS记录一次游戏私服getshell过程mysql联合索引详解百度网盘偷偷更新,终于实现免费不限速了! 全球第一免费开源ERP Odoo Ubuntu最佳开发环境独家首发分享uniapp页面传值总结Android中获取当前正在显示的Activity实例SQL Server 数据库词汇表Python垃圾回收与内存泄露