方法1:List转HashSet再转HashList
public static List<Object> ListDeduplication(List<Object> list){
Set<Object> set = new HashSet<>(list);
return new ArrayList<>(set);
}
速度较好,但是内存占用较多,数据量过大时容易造成heap溢出,计算结果无序
方法2:遍历List,判断set.contains写入set和新list(推荐)
public static List<Object> ListDeduplication2(List<Object> list){
Set<Object> set = new HashSet<>();
ArrayList<Object> list1 = new ArrayList<>();
for (Object o : list) {
if(!set.contains(o)){
list1.add(o);
set.add(o);
}
}
return list1;
}
计算速度很快,内存占用较低,计算结果有序
方法3:遍历List,判断list.contains写入新list
public static List<Object> ListDeduplication3(List<Object> list){
ArrayList<Object> list1 = new ArrayList<>();
for (Object o : list) {
if(!list1.contains(o)){
list1.add(o);
}
}
return list1;
}
数据量过大时速度很慢,内存占用较低,计算结果有序
方法4:list.stream().distinct() jdk1.8以上支持
public static List<Object> ListDeduplication4(List<Object> list){
return list.stream().distinct().collect(Collectors.toList());
}
计算速度很稳定,数据量很大时占优势,计算结果有序
方法5:List转TreeSet再转LinkedList
public static List<Object> ListDeduplication5(List<Object> list){
Set<Object> set = new TreeSet<>(list);
return new LinkedList<>(set);
}
计算速度较快,内存占用较大,计算结果有序