Set集合元素重复比较
当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他已经加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自《Head
fist java》第二版)。这样我们就大大减少了equals的次数,相应就大大提高了执行速度。
如下代码所示:
/**
* @author gosaint
*/
public final class AddDupliacateElementInSet {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(1);
set.add(3);
set.add(4);
set.add(5);
set.add(6);
set.forEach(s -> System.out.println(s));
}
}
打印结果如下;Set集合会自动去重。
但是保不准变态的面试官会让你在Set集合中添加重复元素。让你实现,你该怎么做呢?我在文章开头就写到主要是equals方法和hashcode方法。实现思路是这样:我们让它的equals永远也相等就可以啦。实现和测试如下:
/**
* @author gosaint
*/
public class UnequalWrapper {
private int value;
//...constructor, getter, setter
@Override
public boolean equals(Object o) {
return false;
}
@Override
public int hashCode() {
return Objects.hashCode(value);
}
public static void main(String[] args) {
UnequalWrapper a = new UnequalWrapper(1);
UnequalWrapper b = new UnequalWrapper(2);
UnequalWrapper c = new UnequalWrapper(1);
Set<UnequalWrapper> set = new HashSet<>();
set.add(a);
set.add(b);
set.add(c);
set.forEach(wrapper -> System.out.println(wrapper.getValue()));
}
}
最后建议不这么做。