Activiti7流程高亮场景下HashSet仅能添加一次null值问题求解
问题解答
HashSet对null元素的存储规则
HashSet本身允许存储最多1个null元素,底层逻辑如下:
- HashSet的实现完全基于HashMap,调用
add(元素)方法本质是执行HashMap的put(元素, PRESENT),其中PRESENT是HashSet预定义的静态常量对象,作为所有key对应的固定占位value。 - HashMap处理
null类型的key时,会将null的哈希值固定设置为0,对应存储在哈希数组下标为0的位置。 - 第一次调用
add(null)时,HashMap中没有key为null的键值对,插入操作生效,add()方法返回true。 - 后续再次调用
add(null)时,HashMap会检测到key为null的键值对已存在,仅会覆盖对应的value值,不会新增key,因此HashSet不会新增元素,add()方法返回false,后续的null无法重复加入集合。
场景问题修复建议
你代码中出现null元素,是因为部分拼接得到的actPair不存在于sequenceFlowMap的键集合中,调用get()方法返回了null。如果要避免集合中出现无效的null,可以在添加前增加非空判断,代码示例如下:
actPairSet.forEach(actPair -> { logger.info("actPair:{}, seq:{}", actPair, sequenceFlowMap.get(actPair)); String sequenceId = sequenceFlowMap.get(actPair); // 仅非空的序列流ID才加入高亮集合 if (sequenceId != null) { highSequenceSet.add(sequenceId); } logger.info("{}",highSequenceSet.toString()); });
内容的提问来源于stack exchange,提问作者Criwran
相关产品推荐
相关产品推荐

