《Java工程师必读手册》——Java编程技巧系列——Java编程技巧之数据结构(1)

简介: 《Java工程师必读手册》——Java编程技巧系列——Java编程技巧之数据结构(1)

导读

 

唐宋八大家之一欧阳修在《卖油翁》中写道:

 

| 翁取一葫芦置于地,以钱覆其口,徐以杓酌油沥之,自钱孔入,而钱不湿。因曰:“我亦无他,唯手熟尔。”

 

编写代码的老司机也是如此,老司机之所以被称为老司机”,原因也是无他,唯手熟尔。编码过程中踩过的坑多了,获得的编码经验也就多了,总结的编码技巧也就更多了。总结的编码技巧多了,凡事又能够举一反三,编码的速度自然就上来了。笔者从数据结构的角度,整理了一些Java编程技巧,以供大家学习参考。


一、 使用HashSet判断主键是否存在

 

HashSet实现Set接口,由哈希表(实际上是HashMap)实现,但不保证set的迭代顺序,并允许使用null元素。HashSet的时间复杂度跟HashMap一致,如果没有哈希冲突则时间复杂度为O1,如果存在哈希冲突则时间复杂度不超过On。所以,在日常编码中,可以使用HashSet判断主键是否存在。

 

案例

 

给定一个字符串不一定全为字母,请返回第一个重复出现的字符。

 

image.png

 

其中,由于Set的add函数有个特性——如果添加的元素已经再集合中存在,则会返回false。可以简化代码为:

 

image.png

 

二、 使用HashMap存取键值映射关系

 

简单来说,HashMap由数组和链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。如果定位到的数组位置不含链表,那么查找、添加等操作很快,仅需一次寻址即可,其时间复杂度为O1;如果定位到的数组包含链表,对于添加操作,其时间复杂度为On——首先遍历链表,存在即覆盖,不存在则新增;对于查找操作来讲,仍需要遍历链表,然后通过key对象的equals方法逐一对比查找。从性能上考虑,HashMap中的链表出现越少,即哈希冲突越少,性能也就越好。所以,在日常编码中,可以使用HashMap存取键值映射关系。

 

案例

 

给定菜单记录列表,每条菜单记录中包含父菜单标识(根菜单的父菜单标识为null),构建出整个菜单树。

 

/** 菜单DO类 */

@Setter

@Getter

@ToString

public static class MenuDO {

    /** 菜单标识 */

    private Long id;

    /** 菜单父标识 */

    private Long parentId;

    /** 菜单名称 */

    private String name;

    /** 菜单链接 */

    private String url;

}

 

/** 菜单VO类 */

@Setter

@Getter

@ToString

public 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;

}

 

 接下篇:https://developer.aliyun.com/article/1228149?groupCode=java

相关文章
|
3月前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
56 1
|
3月前
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
98 2
|
23天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
40 5
|
2月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
54 6
|
2月前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
3月前
|
存储 算法 Java
Java 中常用的数据结构
【10月更文挑战第20天】这些数据结构在 Java 编程中都有着广泛的应用,掌握它们的特点和用法对于提高编程能力和解决实际问题非常重要。
37 6
|
3月前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
37 1
|
消息中间件 算法 Java
2023金九银十Java高级工程师面试 1000 题+答案(全)
前言 春节过后招聘旺季就到了,不知道大家是否准备好了,面对金三银四的招聘旺季,如果没有精心准备那笔者认为那是对自己不负责任;就我们 Java 程序员来说,多数的公司总体上面试都是以自我介绍+项目介绍+项目细节/难点提问+基础知识点考核+算法题这个流程下来的。 有些公司可能还会问几个实际的场景类的问题,这个环节阿里是必问的,这种问题通常是没有正确答案的,就看个人的理解,个人的积累了。剩下的就没啥了,都是换汤不换药,聊项目就看你自己对你自己的项目是否理解的透彻,比如经常问你你为什么选择这个技术,为什么这么处理之类的,常考的基础的知识点就那么多,最后算法就是靠刷题。 今天为大家分享的就是当前
|
XML JavaScript Java
华为Java工程师面试题
华为Java工程师面试题
72 0
|
8月前
|
NoSQL Dubbo Java
StringBoot编程式事务与声明式事务java工程师面试突击第一季
StringBoot编程式事务与声明式事务java工程师面试突击第一季

热门文章

最新文章