在Java里如何判断一个集合是否为空_Java集合判空规范说明
发布时间 - 2026-01-28 00:00:00 点击率:次使用 Collection.isEmpty() 是最安全的判空方式,语义清晰、性能为 O(1),适用于所有 Collection 子类型;Map.isEmpty() 同样推荐;Stream 应用 findAny().isPresent() 判空;避免 null 检查冗余,优先通过 Objects.requireNonNull 或 Optional 显式处理。
用 Collection.isEmpty() 是最安全的判空方式
直接调用 isEmpty() 方法,而不是 size() == 0 或 list == null 的组合判断。该方法语义清晰、性能无额外开销(多数实现是 O(1)),且对所有 Collection 子类型(ArrayList、HashSet、LinkedList 等)都适用。
常见错误是先判 null 再判 isEmpty(),但其实:如果集合变量可能为 null,说明设计上已存在隐患——集合应尽量由构造器或工厂方法初始化,或使用 Collections.emptyList() 等不可变空集合兜底。
-
isEmpty()不抛NullPointerException,但前提是对象不为null -
size()在某些懒加载集合(如 MyBatis 的延迟加载Collection)中可能触发意外查询,而isEmpty()通常不会 - 不要写
list != null && !list.isEmpty()作为“保险”,这掩盖了本该在上游避免的null分支
遇到 null 时优先用 Objects.requireNonNull() 或 Optional 包装
若无法确保集合非 null(例如三方 API 返回值),应明确处理 null 场景,而不是在每个判空处补防御式检查。
推荐做法是尽早失败或显式封装:
- 用
Objects.requireNonNull(collection, "collection must not be null")抛出带上下文的异常,便于定位问题源头 - 若业务允许空含义,改用
Optional返回,调用方通过> isPresent()+orElse(Collections.emptySet())统一处理 - 避免在多个地方重复写
if (coll == null || coll.isEmpty())—— 这属于逻辑泄漏,应收敛到工具方法或领域层
Map 判空不能直接用 isEmpty()?不,它完全适用
Map 虽不属于 Collection,但它的 isEmpty() 方法同样标准、高效、语义准确。不要误以为要判 keySet().isEmpty() 或 entrySet().size() == 0。
以下写法等价且推荐第一种:
map.isEmpty() // ✅ 正确、简洁、O(1) map.keySet().isEmpty() // ❌ 多余创建 keySet 视图,无必要map.size() == 0 // ⚠️ 可用,但不如 isEmpty() 表意直接
注意:ConcurrentHashMap 的 isEmpty() 在高并发下可能返回瞬时快照结果,但这是其设计行为,并非 bug;若需强一致性空判断,应配合业务锁或重新评估并发模型。
Stream 判空别用 count() == 0,改用 findAny().isPresent()
如果手头是一个 Stream,不要转成集合再判空,更不要用 stream.count() == 0 —— 它强制遍历全部元素,复杂度 O(n),且无法短路。
正确方式是利用 findAny() 的短路特性:
boolean isEmpty = !stream.findAny().isPresent();
或者更直观地封装为工具方法:
public staticboolean isEmpty(Stream stream) { return !stream.findAny().isPresent(); }
注意:该操作会消费流,不可重复使用;若需多次判断,应先收集为集合(如 toList()),再用 isEmpty()。
null 尽早暴露,让空集合成为可预期的合法状态,而不是每次都要加一层条件套娃。
# java
# 工具
# 懒加载
# stream
# 延迟加载
# mybatis
# NULL
# if
# count
# 封装
# 子类
# Collection
# map
# 并发
# 对象
# bug
# 而不是
# 是一个
# 这是
# 加载
# 若需
# 都要
# 多个
# 遍历
# 适用于
# 要用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
网易LOFTER官网链接 老福特网页版登录地址
如何在自有机房高效搭建专业网站?
微信h5制作网站有哪些,免费微信H5页面制作工具?
如何在建站主机中优化服务器配置?
利用JavaScript实现拖拽改变元素大小
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
如何用PHP快速搭建高效网站?分步指南
Laravel如何实现API版本控制_Laravel版本化API设计方案
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
微信小程序 五星评分(包括半颗星评分)实例代码
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
Android自定义listview布局实现上拉加载下拉刷新功能
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
香港服务器如何优化才能显著提升网站加载速度?
深圳网站制作的公司有哪些,dido官方网站?
高性价比服务器租赁——企业级配置与24小时运维服务
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
如何快速搭建高效服务器建站系统?
Java解压缩zip - 解压缩多个文件或文件夹实例
手机软键盘弹出时影响布局的解决方法
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
Swift开发中switch语句值绑定模式
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何快速搭建个人网站并优化SEO?
如何快速配置高效服务器建站软件?
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
Android自定义控件实现温度旋转按钮效果
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
MySQL查询结果复制到新表的方法(更新、插入)
郑州企业网站制作公司,郑州招聘网站有哪些?
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
如何在IIS7上新建站点并设置安全权限?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
如何确认建站备案号应放置的具体位置?
Laravel PHP版本要求一览_Laravel各版本环境要求对照
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
linux写shell需要注意的问题(必看)


