Java树形结构递归(以时间换空间)和非递归(以空间换时间)
使用场景:如果层级比较多和数据量比较大建议用非递归方式效率更高;
树形结构如下图
测试类代码:
package com.zxq.tree_dom;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import java.util.*;
public class Test {
public static void main(String[] args) {
List<Menu> list = new ArrayList<>();
Menu menu1 = new Menu();
menu1.setId("1");
menu1.setParentId("0");
menu1.setName("菜单1");
list.add(menu1);
Menu menu2 = new Menu();
menu2.setId("2");
menu2.setParentId("0");
menu2.setName("菜单2");
list.add(menu2);
Menu menu1_1 = new Menu();
menu1_1.setId("1_1");
menu1_1.setParentId("1");
menu1_1.setName("菜单1_1");
list.add(menu1_1);
Menu menu1_1_1 = new Menu();
menu1_1_1.setId("1_1_1");
menu1_1_1.setParentId("1_1");
menu1_1_1.setName("菜单1_1_1");
list.add(menu1_1_1);
Menu menu1_1_2 = new Menu();
menu1_1_2.setId("1_1_2");
menu1_1_2.setParentId("1_1");
menu1_1_2.setName("菜单1_1_2");
list.add(menu1_1_2);
Menu menu1_1_3 = new Menu();
menu1_1_3.setId("1_1_3");
menu1_1_3.setParentId("1_1");
menu1_1_3.setName("菜单1_1_3");
list.add(menu1_1_3);
Menu menu1_2 = new Menu();
menu1_2.setId("1_2");
menu1_2.setParentId("1");
menu1_2.setName("菜单1_2");
list.add(menu1_2);
Menu menu2_1 = new Menu();
menu2_1.setId("2_1");
menu2_1.setParentId("2");
menu2_1.setName("菜单2_1");
list.add(menu2_1);
//递归
long time1 = new Date().getTime();
List<Menu> menus = TreeUtils.getTreeList("0", list);
long time2 = new Date().getTime();
System.out.println("耗时:"+(time2-time1));
JSONArray jsonArray= JSONArray.parseArray(JSON.toJSONString(menus));
System.out.println(jsonArray);
System.out.println("循环次数:"+TreeUtils.i);
// //非递归
// long time1 = new Date().getTime();
// List<Menu> treeList = TreeUtils.getTreeListByMap("0", list);
// long time2 = new Date().getTime();
// System.out.println("耗时:"+(time2-time1));
// JSONArray jsonArray= JSONArray.parseArray(JSON.toJSONString(treeList));
// System.out.println(jsonArray);
// System.out.println("循环次数:"+TreeUtils.i);
}
}
资源下载:https://download.csdn.net/download/qq_35222843/13098724