HashSet 可以 add null 吗?
可以!
Set<String> sd = new HashSet<>();
sd.add(null);
sd.add(null);
System.out.println(sd.size());
输出
1
为什么 HashSet 可以 add null 值
因为 HashSet 基于 HashMap 实现,利用 HashMap 实现了 Set 接口的 add 方法。本质是上通过 Key 来进行去重。
如下为 HashSet 的 add 方法:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
PRESENT
是一个静态常量,主要被用来 Map 占位。
如下为 HashMap 中的方法:
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
注意,当某个 key 已存在 value 则会将 value 快照返回,否则返回 null,HashSet 正是利用了这个规则。
注意,HashSet 无论 add 的元素是 null
或者是某个对象,都会填充 PRESENT
value 保证判断成立。