Java集合对null支持不统一:ArrayList等List允许null;HashMap允许null键(唯一)和值,Hashtable禁止任何null;HashSet允许null,TreeSet禁止;ConcurrentHashMap禁止null,CopyOnWriteArrayList允许。

Java集合对null值的支持情况并不统一,是否能存null取决于具体实现类及其设计目标——有的明确允许,有的隐式支持,有的则直接抛异常。
ArrayList、LinkedList、Vector:允许存null
这些基于数组或链表的List实现不禁止null,因为它们只做元素存储,不做键值校验。
-
add(null)、set(index, null)都合法,会正常插入或替换为null -
get()返回null时需谨慎判断是“存的就是null”还是“索引越界导致NPE”(实际不会越界抛NPE,但get(-1)或超出size会抛IndexOutOfBoundsException) - 遍历时遇到
null要主动判空,否则调用方法可能触发NullPointerException
HashMap、LinkedHashMap、Hashtable:区别对待
哈希类集合中,null在键(key)和值(value)上的支持不同:
-
HashMap和LinkedHashMap:允许null作为value,也允许null作为key(只有一个) -
Hashtable:不允许任何null键或null值,put(null, x) 或 put(x,null) 都会立即抛NullPointerException - 注意:
get(null)在HashMap中是合法操作,用于获取key为null对应的value
HashSet、LinkedHashSet、TreeSet:由底层Map决定
这三个Set实现本质是包装了Map(HashMap/TreeMap),所以null支持性继承自其内部Map:
立即学习“Java免费学习笔记(深入)”;
-
HashSet和LinkedHashSet:允许null(因基于HashMap) -
TreeSet:不允许null,因为基于TreeMap,而TreeMap在比较时调用compareTo(),传入null会抛NullPointerException(除非显式传入null-tolerant的Comparator)
ConcurrentHashMap、CopyOnWriteArrayList等并发集合
出于线程安全与设计严谨性考虑,多数并发集合禁止null键或值:
-
ConcurrentHashMap:key和value都不能为null,否则抛NullPointerException -
CopyOnWriteArrayList:允许null(和ArrayList一致) -
ConcurrentLinkedQueue:允许null(JDK9+已禁止,但JDK8仍允许;实际开发中应避免依赖此行为)
实际编码中,不建议刻意依赖null语义,更推荐用Optional、空集合或专用标记对象替代。若必须处理null,务必查阅对应集合类的Javadoc确认行为,尤其在升级JDK或切换集合实现时。










