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