数据去重除了对list循环之外一般会借助Set不包含重复数据特性来达到去重目的。
1、HashSet & LinkedHashSet
重写对象的hashCode和equals,优先判断hashCode返回值是否一样,一样再判断equals。HashSet无序(基于哈希表实现),LinkedHashSet有序(数据添加时的顺序),LinkedHash继承HashSet,均为非同步集合。
2、TreeSet
数据实现Comparable接口,根据compareTo返回值判断数据是否重复,基于红黑树实现,有序(使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法),非同步集合,比较有用的api如下:
higher(E e)
返回此 set 中严格大于给定元素的最小元素;如果不存在这样的元素,则返回 null。
lower(E e)
返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null。
floor(E e)
返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null。
E ceiling(E e)
返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null。
去重写法一般如下,contactSet.addAll之后的集合即为无重复数据集合,去重是以ContactInfoBean对象的getPhone返回值作为去重依据:
Set contactSet = new TreeSet<>(Comparator.comparing(ContactInfoBean::getPhone));
contactSet.addAll(contactItems);
3、Java8新特性stream进行去重
用steam的distinct()方法返回一个由不同数据组成的流,通过对象的equals()方法进行比较。
List data = new ArrayList();
List listWithoutDuplicates = data.stream().distinct().collect(Collectors.toList());