Set集合中可以使用add(Object o)方法向其中添加数据,但是与List集合不同的是,Set中不允许添加重复的数据,那么Set中判重的方式是什么呢?一句话概括就是:当且仅当Set集合中没有包含满足(o==null ? e==null : o.equals(e))条件的元素e时才能将元素o添加到集合中。
由三目运算可知,当要添加的数据为空时,只要原来set集合中没有空值就可以向其中添加,而若原本有空值就不可添加。当要添加的数据不为空时,则要用Set中的equals方法进行判重。
那么重点来了,Set中的equals方法是啥呢?打开源代码,我们会找到
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
继续往下找,我们会找到HashSet中的putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict)方法,然后阅读这个方法,我们会找到判重的方法为p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))。这就很清楚了,只要新加入的元素满足与原有的元素满足:
1、hash值相同并且元素地址相同
或者
2、hash值相同并且满足o所对应数据类型的equals方法的返回值为TRUE
就可认为o与原有的元素是重复的,不可重复添加,其余情况就可添加进Set集合中了。
本文详细解析了Set集合中使用add(Object o)方法添加数据时的判重原理,包括空值判断和equals方法的使用,通过源码分析深入理解Set如何避免重复元素。

277

被折叠的 条评论
为什么被折叠?



