List Set Map 的值能否为NUll?

List、Set 和 Map 的值都可以为 null。

List

List 是一个有序的集合,可以包含重复的元素。在 Java 中,ArrayList 和 LinkedList 都是 List 的实现类。

ArrayList 在 Java 中是基于动态数组实现的。它的设计允许存储任何类型的对象,包括 null。当一个 null 被添加到 ArrayList 中时,它只是作为数组的一个元素被存储,并不会影响到 ArrayList 的内部数据结构,因为数组本身不关心存储的是引用类型还是 null

java 复制代码
List<String> list = new ArrayList<>();
list.add("Hello");
list.add(null);

LinkedList 在 Java 中是基于双向链表实现的。这意味着每个元素都是一个节点,每个节点包含数据和指向前后节点的引用。LinkedList 的设计允许每个节点的数据部分存储任何类型的对象,包括 null。当一个节点的 value 被设置为 null 时,它只是改变了该节点所持有的数据,并不会影响到 LinkedList 的内部双向链表结构。

java 复制代码
 LinkedList<String> list = new LinkedList<>();
 list.add(null);
 list.add(null);

Set

Set 是一个不包含重复元素的集合。

HashSet底层是HashMap,可以有1个为null的元素。

java 复制代码
Set<String> set = new HashSet<>();
set.add("World");
set.add(null);

LinkHashSet底层也是hashmap,允许存在一个为null的元素。

java 复制代码
 LinkedHashSet<String> set = new LinkedHashSet<>();
 set.add("apple");
 set.add(null);

TreeSet 在 Java 中是基于红黑树数据结构实现的。如果尝试将 null 作为节点插入到 TreeSet 中,就会违反红黑树相应规则。无法维护树的结构完整性,因此 TreeSet 在检测到 null 插入尝试时抛出异常,防止数据结构的损坏。

Map

Map 是一个键值对的集合,其中每个键都是唯一的。

HashMap 在 Java 中允许最多只有一个键为 null,多的null值进行覆盖,值可以存储多个null。

java 复制代码
Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", null);

TreeMap 在 Java 中是基于红黑树实现的,它要求每个键对象必须实现了 Comparable 接口或者提供了 Comparator。当向 TreeMap 添加键值对时,put 方法会调用键的 compareTo 方法来确定其在树中的位置。

由于 null 不能被比较(即无法调用 null.compareTo(Object)),尝试将键为 null 的元素添加到 TreeMap 中会导致 NullPointerException。这是因为 TreeMap 需要根据键的比较结果来维护其有序性质,而 null 无法参与这种比较过程。

因此,与 HashMap 不同,TreeMap 不允许键为 null 的元素存在。如果尝试插入键为 null 的元素,将会抛出 NullPointerException,如下例所示:

java 复制代码
TreeMap<String, String> treeMap = new TreeMap<>();
treeMap.put(null, "value"); // 这里会抛出 NullPointerException

Hashtable 是一个古老的数据结构,它基于散列表实现,并且同步以支持多线程环境。与 HashMap 不同,Hashtable 不允许键或值为 null。尝试插入键或值为 null 的元素会导致 NullPointerException

这种设计决策是出于早期的 Java 编程实践,当时可能更倾向于强制程序员避免使用 null 键或值,以确保数据的完整性和明确性。Hashtable 类是在 Java 集合框架出现之前设计的,而 HashMap 是后来随着集合框架的引入而设计的,它允许使用 null 键和值,提供了更多的灵活性。

相关推荐
CSharp精选营13 小时前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假4 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠5 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦12 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠13 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾13 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82113 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q13 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒13 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
世人万千丶13 天前
成语接龙小应用 - HarmonyOS ArkUI 开发实战-TextInput与List列表-PC版本
华为·list·harmonyos·鸿蒙·鸿蒙系统