在Java中集合是否允许存null_Java不同集合支持情况解析
技术百科
P粉602998670
发布时间:2025-12-30
浏览: 次 ArrayList和LinkedList可存null;HashMap允一个null键和多个null值,Hashtable完全禁止;HashSet和LinkedHashSet允许null,TreeSet无参构造时禁止null,自定义Comparator可支持;ConcurrentHashMap禁止null键值,CopyOnWriteArrayList允许null。
ArrayList 和 LinkedList 能否存 null
可以,ArrayList 和 LinkedList 都允许任意数量的 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 支持边界
HashSet 和 LinkedHashSet 允许存 null(因为底层是 HashMap,null 作为 key 存入);TreeSet 是否允许取决于其构造方式:
- 无参构造:使用自然排序,
add(null)直接抛NullPointerException(因为null.compareTo(...)不合法) - 传入自定义
Comparator:若该比较器能安全处理null(例如用Comparator.nullsFirst()),则可存null
注意:TreeSet 中即使允许 null,也只能有一个 —— 因为它按“相等”逻辑去重,而 null 与 null 视为重复。
ConcurrentHashMap 和 CopyOnWriteArrayList 的 null 约束
ConcurrentHashMap 明确禁止 null 键和 null 值,否则在 put() 时就抛 NullPointerException;CopyOnWriteArrayList 允许 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 的静默拒绝,以及 ConcurrentHashMap 对 null 的零容忍 —— 它们不像 HashMap 那样“宽容”,出错位置也更靠前。
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎样安装剪映专业版_Win11安装剪映教
- Windows10系统怎么查看运行时间_Win10
- Win11怎么更改文件夹图标_自定义Win11文件
- ACF 教程:如何正确更新嵌套在多层 Group
- Win11摄像头无法使用怎么办_Win11相机隐私
- Win11怎么设置默认输入法 Win11固定中文输
- PHP的Workerman对架构扩展有啥帮助_应用
- c++中explicit(bool)的用法 c++
- Win10系统更新错误0x80240034怎么办
- C++如何将C风格字符串(char*)转换为std
- Win11如何设置自动关机 Win11定时关机命令
- Win11怎样安装钉钉客户端_Win11安装钉钉教
- 手机php文件怎么变成mp4_安卓苹果打开php转
- php订单日志怎么记录评价_php记录订单评价日志
- Win11怎么调整屏幕亮度_Windows 11调
- Win11用户账户控制怎么关_Win11关闭UAC
- 如何使用Golang实现路由参数绑定_使用Mux和
- 如何自定义Windows终端的默认配置文件?(Po
- TestNG的testng.xml配置文件怎么写
- Windows系统被恶意软件破坏后的恢复策略_错误
- MAC的“接续互通”功能无法使用怎么办_MAC检查
- 如何诊断并终止卡死的 multiprocessin
- Win10如何卸载预装Edge扩展_Win10卸载
- Python数据挖掘核心算法实践_聚类分类与特征工
- php485支持哪些操作系统_php485跨系统支
- 为什么本地php环境运行php脚本卡顿_php执行
- 如何在Golang中使用replace替换模块_指
- Win11怎么开启游戏模式_Windows11优化
- 如何使用Golang实现基本类型比较_Golang
- Linux怎么查找死循环进程_Linux系统负载分
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- Windows10如何更改桌面背景_Win10个性
- Win10如何备份注册表_Win10注册表备份步骤
- c++中如何使用auto关键字_c++11类型推导
- php订单日志怎么在swoole写_php协程sw
- Windows10电脑怎么设置防火墙出站规则_Wi
- Windows如何拦截2345弹窗广告_Windo
- c++如何使用std::bitset进行位图算法_
- Win11 C盘满了怎么清理 Win11磁盘清理和
- Python模块的__name__属性如何由导入方
- c++怎么编写动态链接库dll_c++ __dec
- Python字符串处理进阶_切片方法解析【指导】
- Win11怎么开启智能存储_Windows11存储
- Windows10如何彻底关闭自动更新_Win10
- Windows10如何删除Windows.old_
- Python 中将 ISO 8601 时间戳转换为
- 如何在 Python 中将 ISO 8601 时间
- VSC怎么创建PHP项目_从零开始搭建项目的步骤【
- php删除数据怎么软删除_添加is_del字段标记
- Python字符串操作教程_切片拼接与格式化详解

ashMap允一个null键和多个null值,Hashtable完全禁止;HashSet和LinkedHashSet允许null,TreeSet无参构造时禁止null,自定义Comparator可支持;ConcurrentHashMap禁止null键值,CopyOnWriteArrayList允许null。
QQ客服