在Java中集合是否允许存null_Java不同集合支持情况解析

发布时间 - 2025-12-30 00:00:00    点击率:
ArrayList和LinkedList可存null;HashMap允一个null键和多个null值,Hashtable完全禁止;HashSet和LinkedHashSet允许null,TreeSet无参构造时禁止null,自定义Comparator可支持;ConcurrentHashMap禁止null键值,CopyOnWriteArrayList允许null。

ArrayList 和 LinkedList 能否存 null

可以,ArrayListLinkedList 都允许任意数量的 null 元素。它们底层基于数组或链表实现,不校验元素是否为 null

常见错误现象:调用 get() 返回 null 后直接链式调用方法(如 list.get(i).toString()),触发 NullPointerException —— 这不是集合本身的问题,而是业务逻辑未判空。

  • add(null) 正常执行,不会抛异常
  • contains(null) 返回 true(如果确实添加过)
  • indexOf(null) 返回第一个 null 的下标

HashMap 和 Hashtable 对 null 的处理差异

HashMap 允许一个 null 键和任意多个 null 值;Hashtable 则完全禁止 null 键和 null 值,否则立即抛 NullPointerException

原因在于 Hashtable 是遗留类,设计时强调线程安全与严格校验;HashMap 更注重灵活性与性能,把判空责任交给使用者。

  • new HashMap().put(null, "a") ✅ 成功
  • new Hashtable().put(null, "a") ❌ 抛 NullPointerException
  • new HashMap().put("k", null) ✅ 成功
  • new Hashtable().put("k", null) ❌ 同样抛异常

HashSet、TreeSet、LinkedHashSet 的 null 支持边界

HashSetLinkedHashSet 允许存 null(因为底层是 HashMapnull 作为 key 存入);TreeSet 是否允许取决于其构造方式:

  • 无参构造:使用自然排序,add(null) 直接抛 NullPointerException(因为 null.compareTo(...) 不合法)
  • 传入自定义 Comparator:若该比较器能安全处理 null(例如用 Comparator.nullsFirst()),则可存 null

注意:TreeSet 中即使允许 null,也只能有一个 —— 因为它按“相等”逻辑去重,而 nullnull 视为重复。

ConcurrentHashMap 和 CopyOnWriteArrayList 的 null 约束

ConcurrentHashMap 明确禁止 null 键和 null 值,否则在 put() 时就抛 NullPointerExceptionCopyOnWriteArrayList 允许 null,行为同 ArrayList

这是并发容器的主动防御设计:ConcurrentHashMap 内部大量依赖 key.hashCode()key.equals(),而 null 会导致这些调用失败或语义模糊,所以从源头拦截。

  • new ConcurrentHashMap().put(null, "v") ❌ 立即报错
  • new CopyOnWriteArrayList().add(null) ✅ 允许
  • Collections.synchronizedSet(new HashSet()) 允许 null(同步包装不改变底层行为)
Map map = new ConcurrentHashMap<>();
// 下面这行会抛 NullPointerException,不是运行时偶然,而是设计强制
map.put(null, "value"); // java.lang.NullPointerException
实际编码中,最容易被忽略的是 TreeSet 的自然排序场景下对 null 的静默拒绝,以及 ConcurrentHashMapnull 的零容忍 —— 它们不像 HashMap 那样“宽容”,出错位置也更靠前。


# java  # 编码  # ai 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高防服务器:AI智能防御DDoS攻击与数据安全保障  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  如何在 Pandas 中基于一列条件计算另一列的分组均值  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  PythonWeb开发入门教程_Flask快速构建Web应用  Laravel如何生成API文档?(Swagger/OpenAPI教程)  香港服务器租用费用高吗?如何避免常见误区?  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Laravel PHP版本要求一览_Laravel各版本环境要求对照  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  Laravel怎么在Blade中安全地输出原始HTML内容  JS去除重复并统计数量的实现方法  如何快速搭建高效WAP手机网站吸引移动用户?  nginx修改上传文件大小限制的方法  网站制作大概多少钱一个,做一个平台网站大概多少钱?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel API资源类怎么用_Laravel API Resource数据转换  Laravel中的Facade(门面)到底是什么原理  Linux网络带宽限制_tc配置实践解析【教程】  Laravel如何配置任务调度?(Cron Job示例)  网站制作壁纸教程视频,电脑壁纸网站?  如何快速上传自定义模板至建站之星?  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  如何用西部建站助手快速创建专业网站?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  如何批量查询域名的建站时间记录?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  如何在万网主机上快速搭建网站?  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  Laravel怎么使用artisan命令缓存配置和视图  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  青岛网站建设如何选择本地服务器?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  Linux系统运维自动化项目教程_Ansible批量管理实战  深圳网站制作培训,深圳哪些招聘网站比较好?  如何自定义建站之星模板颜色并下载新样式?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Android GridView 滑动条设置一直显示状态(推荐)  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  如何打造高效商业网站?建站目的决定转化率  利用JavaScript实现拖拽改变元素大小  JavaScript如何实现音频处理_Web Audio API如何工作?  米侠浏览器网页背景异常怎么办 米侠显示修复