En termes simples, HashMap se compose de tableaux et de listes chaînées. Les tableaux constituent le corps principal de HashMap, et les listes chaînées existent principalement pour résoudre les conflits de hachage. Si la position du tableau localisé ne contient pas de liste chaînée, alors les opérations de recherche, d'ajout et autres sont très rapides et ne nécessitent qu'un seul adressage. La complexité temporelle est O(1) si le tableau localisé contient une liste chaînée, pour l'opération d'ajout. , sa complexité temporelle est O(1). La complexité temporelle est O(n) - parcourez d'abord la liste chaînée, écrasez-la si elle existe, ajoutez-la si elle n'existe pas pour l'opération de recherche, vous devez toujours parcourir la liste chaînée ; liste chaînée, puis comparez et recherchez un par un via la méthode égale de l'objet clé. Du point de vue des performances, moins il y a de listes chaînées dans HashMap, c'est-à-dire moins il y a de conflits de hachage, meilleures sont les performances. Par conséquent, dans le codage quotidien, vous pouvez utiliser HashMap pour accéder aux relations de mappage clé-valeur.
Cas : Étant donné une liste d'enregistrements de menu, chaque enregistrement de menu contient l'identifiant du menu parent (l'identifiant du menu parent du menu racine est nul), et l'arborescence de menu entière est construite.
/** 菜单DO类 */@Setter@Getter@ToStringpublic static class MenuDO { /** 菜单标识 */ private Long id; /** 菜单父标识 */ private Long parentId; /** 菜单名称 */ private String name; /** 菜单链接 */ private String url; }/** 菜单VO类 */@Setter@Getter@ToStringpublic static class MenuVO { /** 菜单标识 */ private Long id; /** 菜单名称 */ private String name; /** 菜单链接 */ private String url; /** 子菜单列表 */ private List<MenuVO> childList; }/** 构建菜单树函数 */public static List<MenuVO> buildMenuTree(List<MenuDO> menuList) { // 检查列表为空 if (CollectionUtils.isEmpty(menuList)) { return Collections.emptyList(); } // 依次处理菜单 int menuSize = menuList.size(); List<MenuVO> rootList = new ArrayList<>(menuSize); Map<Long, MenuVO> menuMap = new HashMap<>(menuSize); for (MenuDO menuDO : menuList) { // 赋值菜单对象 Long menuId = menuDO.getId(); MenuVO menu = menuMap.get(menuId); if (Objects.isNull(menu)) { menu = new MenuVO(); menu.setChildList(new ArrayList<>()); menuMap.put(menuId, menu); } menu.setId(menuDO.getId()); menu.setName(menuDO.getName()); menu.setUrl(menuDO.getUrl()); // 根据父标识处理 Long parentId = menuDO.getParentId(); if (Objects.nonNull(parentId)) { // 构建父菜单对象 MenuVO parentMenu = menuMap.get(parentId); if (Objects.isNull(parentMenu)) { parentMenu = new MenuVO(); parentMenu.setId(parentId); parentMenu.setChildList(new ArrayList<>()); menuMap.put(parentId, parentMenu); } // 添加子菜单对象 parentMenu.getChildList().add(menu); } else { // 添加根菜单对象 rootList.add(menu); } } // 返回根菜单列表 return rootList; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!