簡單來說,HashMap由陣列和鍊錶組成的,陣列是HashMap的主體,鍊錶則是主要為了解決哈希衝突而存在的。如果定位到的數組位置不含鍊錶,那麼查找、添加等操作很快,僅需一次尋址即可,其時間複雜度為O(1);如果定位到的數組包含鍊錶,對於添加操作,其時間複雜度為O(n)-首先遍歷鍊錶,存在即覆蓋,不存在則新增;對於查找操作來講,仍需要遍歷鍊錶,然後透過key物件的equals方法逐一比較來找出。從效能上考慮,HashMap中的鍊錶出現越少,即哈希衝突越少,效能也越好。所以,在日常編碼中,可以使用HashMap存取鍵值映射關係。
案例:給定選單記錄列表,每個選單記錄中包含父選單標識(根選單的父選單標識為null),建構出整個選單樹。
/** 菜单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; }
以上是java如何使用HashMap存取鍵值映射關係的詳細內容。更多資訊請關注PHP中文網其他相關文章!