高效判断集合与Map为空的实用技巧与工具类对比

解析Java集合工具类:功能与实践 二分插入排序法是插入排序法的升级版本,如下所示,我们都知道插入排序后左边的元素都是有序的,如果使用常规二分排序,那么最坏情况下插入时间是O(n),所以我们基于左边有序这个特点改用二分插入的方式完成排序优化了这个问题。在编程的广袤领域中,集合是一个至关重要的概念,它犹如数据的魔法盒子,承载着各种元素的有序或无序组合。这个函数则说明这个数组为不具备随机访问性的链表,为了保证性能,该方法会通过计算的方式得到计算出一个批量移动的区间,然后基于这两个整体进行批量的移动。 阅读详情

1. 别再混用了!分清CollectionUtils和MapUtils是你的第一步

你是不是也和我一样,刚开始写代码那会儿,觉得判断集合和Map是否为空,不就是检查一下null和size吗?用哪个工具类都差不多。结果,我就踩过坑。有一次,我导入了org.apache.commons.collections.CollectionUtils,信心满满地用它去判断一个Map是否为空,结果编译器直接报错,当时就懵了。后来才发现,原来这里面的门道还挺多,用错了工具类,轻则编译不通过,重则可能埋下空指针的隐患。

简单来说,集合(Collection) 和 Map 在Java里是两种不同的数据结构。集合,像我们常用的List、Set,它们装的是一个个独立的元素。而Map呢,它装的是“键值对”,一个钥匙对应一个值。正因为底层结构不同,所以专门处理它们的工具类也常常是“各司其职”。最核心的一点:CollectionUtils.isEmpty() 方法,绝大多数版本只能用来判断集合,不能直接判断Map。如果你硬塞一个Map给它,它要么编译报错(因为方法参数类型是Collection),要么在某些特定的工具类版本里,可能会因为方法重载而“侥幸”通过,但这绝对不是一个好习惯,会严重降低代码的可读性和可维护性。

所以,我们这篇文章要解决的,就是帮你彻底理清这个看似简单却容易出错的问题。我会带你对比几个最常用的工具类,比如Apache Commons Lang的MapUtils、Spring Framework的CollectionUtils,还有原生的Java写法。我会告诉你它们各自适合什么场景,有什么优缺点,以及我在实际项目中总结出来的那些“坑”和最佳实践。目标很简单:让你以后写判断空值的代码时,心里有底,手下不慌,写出既安全又高效的代码。

2. 工具类全景对比:谁才是判断空值的“瑞士军刀”?

面对判断空值的需求,我们手头其实有好几套工具。别急着随便选一个就用,了解它们的“出身”和“特长”,才能做出最适合你当前项目的选择。下面这个表格是我根据多年经验整理的,你可以先快速浏览一下,有个整体印象。

工具类 / 方法所属库主要用途判断集合是否为空判断Map是否为空特点与注意事项
CollectionUtils.isEmpty()Apache Commons Collections (旧版)集合操作✅❌ (仅接受Collection参数)老牌库,方法功能单一,仅针对集合。
MapUtils.isEmpty()Apache Commons Collections (旧版)Map操作❌✅与上一个配对使用,专门处理Map。
CollectionUtils.isEmpty()Spring Framework通用集合工具✅✅ (通过重载方法)最常用、最推荐。一个方法兼容集合和Map,判空逻辑一致。
ObjectUtils.isEmpty()Apache Commons Lang3通用对象判断✅ (但逻辑不同)✅ (但逻辑不同)判断逻辑是 obj == null 或 obj.length/size == 0,对字符串、数组、集合、Map都适用,但需注意其逻辑。
原生写法Java SDK-✅ (coll == null || coll.isEmpty())✅ (map == null || map.isEmpty())最直接,无依赖,但代码略显冗长。

看了这个表格,你可能已经发现,Spring Framework的CollectionUtils 似乎是个“全能选手”。没错,这也是它在企业级开发中如此流行的原因之一。它通过方法重载,让isEmpty这一个方法名,既能处理Collection,也能处理Map,甚至其他一些集合类型,极大地简化了API,减少了我们记忆的负担。而Apache Commons的那一套,则需要我们明确区分CollectionUtils和MapUtils,虽然职责更清晰,但在日常开发中切换起来有点麻烦。

不过,Spring的也不是没有缺点。如果你的项目是一个纯工具模块,不想引入庞大的Spring框架,仅仅为了一个判空功能,那显然不合适。这时候,Apache Commons Lang3的ObjectUtils.isEmpty()或者原生写法就是更好的选择。ObjectUtils.isEmpty()的判断逻辑更加通用,它检查的是对象的“空”状态:对于null、空字符串“”、空数组、空集合、空Map,它都返回true。这和你直觉上的“空”可能完全一致,但要注意,它和Collection.isEmpty()的标准有时有细微差别(比如对一个所有元素都为null的集合,前者可能认为非空?这里值得展开,我们后面会细说)。

3. 深入源码:理解“空”背后的逻辑,避开隐形陷阱

工具用起来简单,但如果不理解它们背后的逻辑,就可能掉进坑里。我们直接扒开源码看看,这才是最靠谱的学习方式。

先看Spring Framework的CollectionUtils.isEmpty()。找到它的源码(以Spring 5.x为例),你会发现它有两个重载方法:

// 判断Collection是否为空
public static boolean isEmpty(Collection<?> collection) {
    return (collection == null || collection.isEmpty());
}

// 判断Map是否为空
public static boolean isEmpty(Map<?, ?> map) {
    return (map == null || map.isEmpty());
}

看,多么清晰!逻辑完全一致:先判null,再调用原生isEmpty()方法。这就是为什么它好用,因为它的行为是可预测的,和Java内置的语义保持一致。你用它判断一个Map,和你自己写map == null || map.isEmpty()效果一模一样,但代码更简洁。

再来看看Apache Commons Lang3的ObjectUtils.isEmpty()。它的源码是这样的:

public static boolean isEmpty(Object obj) {
    if (obj == null) {
        return true;
    }
    if (obj instanceof CharSequence) {
        return ((CharSequence) obj).length() == 0;
    }
    if (obj.getClass().isArray()) {
        return Array.getLength(obj) == 0;
    }
    if (obj instanceof Collection) {
        return ((Collection<?>) obj).isEmpty();
    }
    if (obj instanceof Map) {
        return ((Map<?, ?>) obj).isEmpty();
    }
    // 其他情况返回false
    return false;
}

这个方法的设计思想是“泛型判空”。它不关心你传进来的是List还是Map还是String,它用一系列instanceof检查类型,然后执行对应的空判断。这里有一个非常重要的细节:它对于Collection和Map,是直接调用其isEmpty()方法,而没有先检查元素是否为空。这意味着,如果一个List里有三个元素,但这三个元素都是null,这个List本身的isEmpty()会返回false(因为它有size),那么ObjectUtils.isEmpty()也会返回false。这和你用Spring的CollectionUtils.isEmpty()结果是一样的,但这可能和你的业务逻辑期望不符!你的业务可能认为“所有元素都无效”就等同于“空”。这就是理解源码的重要性,它能帮你预判行为,避免逻辑错误。

那么,Apache Commons Collections的旧版工具类呢?它的CollectionUtils.isEmpty(Collection coll)源码和Spring的几乎一样,但关键问题是,它没有提供接收Map参数的重载方法。所以当你把Map传给它时,如果方法签名不匹配,编译器这一关就过不去。这就是我开头提到的那个编译错误的原因。

4. 实战场景与避坑指南:我的经验之谈

知道了原理,我们来看看怎么用,以及哪里容易踩坑。我结合自己遇到过的情况,给你梳理了几个典型场景。

场景一:从外部接口接收数据 这是最经典的场景。比如你调用一个第三方API,它返回一个JSON,你解析后得到一个Map<String, Object>。这个Map完全有可能为null(接口出错),或者为一个空的HashMap(接口成功但无数据)。这时候,使用if (map == null || map.isEmpty())这种原生写法当然没问题,但用Spring CollectionUtils.isEmpty(map)或MapUtils.isEmpty(map)显然更优雅,意图也更明确。切记:不要直接if (map != null)就了事,然后就去遍历,空Map也是需要处理的。

场景二:多层嵌套结构的判空 这个坑我踩得最深。比如你有一个数据结构:Map<String, List<User>>。你需要判断某个键对应的用户列表是否存在且有数据。错误写法是:

List<User> users = dataMap.get("key");
if (users != null) {
    for (User u : users) { // 如果users是空列表,循环不会执行,但逻辑可能不对
        // ...
    }
}

更安全的写法是:

List<User> users = dataMap.get("key");
if (CollectionUtils.isNotEmpty(users)) { // 使用Spring或类似工具
    for (User u : users) {
        // ...
    }
} else {
    // 处理列表为空或为null的情况
}

对于多层嵌套,比如Map<String, Map<String, List<String>>>,你需要从外到内一层层判断,每一层都使用安全的判空方法。这里Spring CollectionUtils的统一API优势就体现出来了,你不需要在CollectionUtils和MapUtils之间来回切换。

场景三:使用ObjectUtils.isEmpty()的注意事项 前面提到它对于元素全为null的集合会认为非空。如果你的业务需要过滤掉这种“无效空集合”,你需要自己写工具方法,例如:

public static boolean isCollectionEffectivelyEmpty(Collection<?> coll) {
    if (ObjectUtils.isEmpty(coll)) {
        return true;
    }
    // 检查集合中所有元素是否都为null
    for (Object obj : coll) {
        if (obj != null) {
            return false;
        }
    }
    return true;
}

同理,对于Map,你可能需要检查其所有value是否都为null。这再次说明,没有万能的工具,只有适合场景的工具。

关于性能的迷思 有人可能会想,工具方法多了一层方法调用,会不会有性能损耗?我可以负责任地说,在99.9%的应用场景中,这种开销完全可以忽略不计。JVM的JIT编译器会优化这些简单的静态方法调用。选择工具类带来的代码清晰度、可维护性和减少错误的好处,远远大于那微不足道的性能顾虑。除非你在写极限性能的底层代码,否则请优先考虑代码的简洁与安全。

5. 如何选择与封装:打造你的团队工具库

看到这里,你应该对如何选择有了自己的想法。我来给你一个直接的决策路径:

  1. 如果你的项目已经是Spring生态:毫不犹豫地使用 org.springframework.util.CollectionUtils。它是事实上的标准,团队协作成本最低,API也最友好。
  2. 如果是轻量级工具项目或库:考虑使用 Apache Commons Lang3 的 ObjectUtils.isEmpty()。它的泛用性很好,且Lang3库非常轻量、稳定,包含大量其他实用工具。但务必让团队所有成员都清楚它对“空集合”的判定逻辑。
  3. 如果追求极简、零依赖:那就用原生写法。虽然啰嗦点,但绝对安全可控。我建议你可以把它封装成自己项目里的一个工具类,比如MyAppUtils,这样既保持了零依赖,又实现了代码复用和统一。
  4. 尽量避免使用旧的Apache Commons Collections:除非是老项目维护,否则不建议在新项目中主动引入。它的API设计已经略显过时,而且容易引发我们开头提到的混淆问题。

对于团队来说,我强烈建议统一判空规范。你可以在团队的技术规范文档中明确写上一条:“集合与Map的判空,统一使用Spring CollectionUtils(Spring项目)或MyAppUtils.isEmpty()(非Spring项目)”。并且,在Code Review时,把不规范的判空写法揪出来。我自己带团队时就是这么干的,一开始大家会不习惯,但坚持一段时间后,代码质量肉眼可见地提升了,因为空指针异常真的变少了。

最后,再分享一个我自己的小习惯:我倾向于使用 isNotEmpty() 而不是 !isEmpty()。因为前者读起来更顺口,更像自然语言。“如果集合不为空,则执行...” 比 “如果非空集合...” 在思维转换上更直接一点点。当然,这只是个人偏好,不影响功能。

判断集合和Map是否为空,就像开车前检查后视镜一样,是一个基础但至关重要的安全动作。选对工具,理解原理,养成习惯,就能让你的代码之路开得更稳、更远。希望我今天的这些分享,能帮你把这个小细节打磨得更好。

手撕Java系列-集合框架详解,List,Set,Queue,Deque,Map,并发集合,集合工具类,Stream API 阅读详情

相关推荐

判断map对象是否为空等工具类

这是一个工具类用于判断map中的键值对是否为空!普通判断若遇上空会报空指针异常!

判断集合和map是否为空

之前一直以为判断集合和map都是用CollectionUtils即可,实际上不然。 1、CollectionUtils判断集合是否为空 CollectionUtils工具类的常用方法: 例1: 判断集合是否为空:   CollectionUtils.isEmpty(null): true   CollectionUtils.isEmpty(new ArrayList()): true     CollectionUtils.isEmpty({a,b}): false 例2: 判断集合是否不为空:   

mingyuli的博客 1万+

VSCode 降低适用版本并且关闭自动更新

官方表示,提高了远程服务器构建工具链的最低要求,更新了对 glibc 的要求,需要最低2.28版本。最快的方法是把vs code的版本降到1.85(为什么是这个版本呢?打开VS Code的官方网站(https://code.visualstudio.com/)通过查看可以知道,具体的版本没有直接显示分类,他是根据发布日期来分类的同时和版本匹配。在网站的顶部导航栏中找到”Updates”按钮,点击进入下载页面。找了半天一直没发现,原来就在紧挨着的下面。远程主机不满足运行vs code服务器的先决条件。

Sunflower的博客 9586

map判空

Map<String, String> map = new Hash<>(); 1、使用工具类 MapUtils.isEmpty(map) 2、使用原生的 map == null || map.isEmpty()

m0_50802926的博客 1429

实现高精度卷积混响--MATLAB仿真篇

一、前言 之前在STM32F407上现实了直播声卡,实现的经典Schroeder混响模型和Moorer混响模型,得到不错效果。后来得知卷积混响最为真实地表现空间的特性,所以也就尝试在MCU上实现一个高精度的卷积混响(卷积点数为32768),目前MCU出来的混响效果算得上一流水准,本人也在计划在ADI的21489或者SC584上更高精度的卷积混响。 二、卷积方式 1、conv1是使用MATLAB自带卷积函数conv 2、conv2和conv3是改进后卷积过程,具有减少运算量特点,方便嵌入式移植 clear;

Six44的博客 5082

esim分布式云卡池技术

eSIM卡,即Embedded-SIM,嵌入式SIM卡。eSIM卡的概念就是将传统SIM卡直接嵌入到设备芯片上,而不是作为独立的可移除零部件加入设备中,用户无需插入物理SIM卡。这一做法将允许用户更加灵活的选择运营商套餐,或者在无需解锁设备、购买新设备的前提下随时更换运营商。未来通用的eSIM标准建立将为普通消费者、企业用户节省更多移动设备使用成本,并带来更多的便利、安全性。 2018年 3月7日,中国联通宣布,正式在上海、天津、广州、深圳、郑州、长沙6座城市率先启动“eSIM一号双终端”业务的办理。[.

著名博客 3710

java对象判断是否为空工具类

package common; import java.util.List; import java.util.Map; import com.google.common.collect.Maps; /** * * 工具类 * * @version 1.0 * @since JDK1.7 */ public class ObjectUtils { /** *

OceanSky的专栏 2万+

五段式S型算法笔记

又因为有 v-v0= 0.5jt通式: 所以有 vm-v0= 0.5jtm 所以有4vm-4v0= 2jtm。算法1: v=2vm-v0-0.5*jt+2jt*tm-2jtm*tm。加加速度j 自己设置 已知,vmax自己设置已知;所以有4vm-4v0= 2jtm带入算法1。

qq_36658033的博客 683

如何判断List 集合和Map 集合是否为空

【代码】如何判断List 集合和Map 集合是否为空。

林夕 3067

simulink调用C代码函数-C Caller模块

simulink中如何调用写好的C代码函数?使用C Caller模块调用C代码。

weixin_40531919的博客 5675

transformer中QKV的通俗理解(剩女与备胎的故事)

用vit的时候读了一下transformer的思想,前几天面试结束之后发现对QKV又有点忘记了, 写一篇文章来记录一下 参考链接: 哔哩哔哩:在线激情讲解transformer&Attention注意力机制(上)在线激情讲解transformer&Attention注意力机制(上)_哔哩哔哩_bilibiliAttention is all you need介绍 更具体的介绍可以去阅读论文在Attention is all you need这篇文章中提出了著名的Transformer模型Transforme

Peter的博客 1万+

数据类型Map判空 、空字符串、空key值等各种判断方法,全网最详细

Map集合对于开发人员来说这种数据类型再熟悉 不过,个人也是特别喜欢这种键值对存在的数据类型,在自己做政府项目中,老项目组开发人员已经把controller层接收到的数据全部封装成立Map类型。 在业务逻辑层处理中,往往会对Map数据类型进行一些判空的处理,自己总结了一下,将判断方法写出供大家参考: 一、Map本身得判空 1.1“==null”判断Map本身是否为null 首先看我的demo 初...

goGoing_的博客 5万+

《QGIS快速入门与应用基础》151:批量属性值赋值(字段计算器)

本文介绍了QGIS中字段计算器的批量属性值赋值方法,重点讲解了简单赋值(统一值和递增序列)的操作步骤与表达式应用。文章首先强调数据备份、字段类型确认等必要前提,随后详细解析字段计算器的界面功能分区和打开方式。通过具体场景示例,展示了如何为图层统一赋值固定值或生成连续编号序列,并提供了文本、数字、日期等不同字段类型的表达式模板。文中特别提醒新手优先创建新字段而非直接更新现有字段,以避免数据丢失风险,同时推荐使用$id和rownum()函数实现基础序列生成。该教程适合GIS初学者快速掌握批量属性编辑的核心技能。

LuckyHanMo的博客 491

java判断集合为空_Java中判断集合类为空的方法

*****需要引入Spring的核心Jar包*****工具类:org.springframework.util.CollectionUtils方法:public static boolean isEmpty(Collection collection){return collection == null || collection.isEmpty();}public static boolean ...

weixin_39883670的博客 5040

自动驾驶大模型---小米&华科的ORION端到端方案

本文介绍了小米汽车与华中科技大学联合开发的ORION自动驾驶端到端方案。该框架创新性地将视觉语言模型(VLM)与自动驾驶系统结合,包含QT-Former特征提取模块、大语言模型(LLM)推理模块和生成式规划器三大核心组件。通过视觉感知与语言理解的深度融合,ORION能更准确地理解人类指令并生成合理轨迹,同时提升系统的可解释性。实验证明,该方案在准确性、泛化能力和决策透明度方面均有显著优势。ORION框架为自动驾驶技术提供了新思路,有望推动行业向更安全、智能的方向发展。

智能汽车人的博客 2005

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Map集合转换成实体类对象,实体类对象转换为map集合,互转工具类

注 : 2019-06-16日 增加第六节 map与实体互转工具类,直接看第6节; 1.调用这个方法BeanMapUtils.mapToBean(),实现map集合转实体类对象; 注意:这个方法转换时我这边老是报类型转换错误,引用这段代码没有报错的小伙伴可继续使用,此方法扩展性好,报错的小伙伴请看最下面的一个map转实体类对象方法; //1.通过map构造permiss...

苏凯的博客 3万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java Map 集合与 Collections 工具类全解析

本文围绕 Java 中 Map 集合、可变参数及 Collections 工具类展开解析。首先介绍 Map 集合作为双列集合的核心特性,包括双列存储、键唯一、值可重复等,详解 HashMap 等常用实现类,演示添加、删除等常用 API 及键找值、键值对、Lambda 表达式三种遍历方式。接着阐述可变参数的语法、底层原理与使用注意事项,解决方法参数个数不确定问题。然后讲解 Collections 工具类的批量添加、排序、打乱等核心功能及线程安全方法。

Shabbt的博客 1175

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java判断是否为空工具类判断为空

package brilliance.znjt.serviceratingservice.utils; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; public class xx { /** * 对象是否为空 * @param obj St...

gaston的博客 5346

Java工具类(四) 判断数组/集合为空的工具类

判断数组/集合为空的工具类 package com.cnblog.util; import java.util.Collection; import java.util.List; import java.util.Map; /** * 判断 数组/集合 为空的工具类 * @author jian.liu * */ public class ArrayUtil { //判断集合...

weixin_30784501的博客 4726

多列集合---Map

本文介绍了Java中的Map集合及其工具类。Map作为多列集合,通过键值对(key-value)存储数据,具有key唯一、value可重复的特点。重点分析了三种实现类:HashMap(无序高效)、TreeMap(自动排序)、LinkedHashMap(保留插入顺序)。文章通过示例演示了Map的基本操作(增删改查)和三种遍历方式,并对比了Map与单列集合Set的差异。最后介绍了Collections工具类提供的排序、反转等静态方法。作者建议通过实践掌握集合的使用,并留下练习题供读者思考。

倾蝶羽裳,漫雨疏狂 1622

Java中的集合框架:List、Set、Map的使用与性能对比

Java集合框架的选择本质是时空权衡的艺术ArrayList是随机访问的王者LinkedList擅长动态修改提供O(1)的查询奇迹赋予数据天然秩序征服并发战场掌握每种集合的时间复杂度(Time Complexity)和空间特性(Spatial Characteristics),才能在面对海量数据时游刃有余。记住:没有最好的集合,只有最合适的集合!在新项目中根据需求选择合适的集合类。学习和探索更多的集合框架高级技巧,如自定义集合和集合的并发处理。

司徒鸿的博客 2416

三大集合:List、Map、Set的区别与联系

List、Map、Set的区别与联系 一、结构特点 List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合; List中存储的数据是有顺序的,并且值允许重复;Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;Set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set集合是根据hashcod...

star_yang的博客 11万+

判断List、Map、Set是否为空及效率比较

有时候需要对List、Map、Set是否为空进行判断,从项目的角度来看,建议如下编写参考。 Java Code Show : //如果object为null,则设置为defaultValue ObjectUtils.defaultIfNull(object, defaultValue); //判断集合是否为null List<String> list = new ArrayList<>(); System.out.println(list.isEmpty());

MissOfSpring的博客 609

Java之Map集合、Collections工具类

Map集合 Collections工具类 泛型

qq_43336579的博客 494

工具类——EmptyUtils为空判断

一、EmptyUtils编写package com.blankj.utilcode.util;import android.os.Build; import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; import android.util.

Tomasyb的博客 5579

别再用 !=null 判空了,那么多工具类你不用吗

别再用 !=null 判空了,那么多工具类你不用吗

【可全包】本人程序员,不需要做任何吹嘘,只是实在写点程序,写点文档,熟悉各类主流框架,SSM,SpringBoot,Flask,Djiango,Mysql,Sqlite,VUE,Uniapp等,各类程序设计专家,优质作者 888
上一篇: 医疗诊断中的信号检测:从理论到临床决策的5个关键步骤
下一篇: 电路设计实战:钽电容选型与安全应用指南
linux6sysadmin
博客等级 码龄4年 59粉丝 1615原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值