Java List 去重性能对比
直接上代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.collections.CollectionUtils;
public class ListDistinctTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
// 构造list
for (int i = 0; i < 10000; i++) {
list.add(String.valueOf(i));
}
// 重复值
for (int i = 0; i < 2000; i++) {
list.add(String.valueOf(i));
}
// 打乱
Collections.shuffle(list);
List<String> list1 = new ArrayList<>();
CollectionUtils.addAll(list1, new Object[list.size()]);
Collections.copy(list1, list);
//------------------直接冒泡去重
long startTime1 = System.currentTimeMillis();
for (int i = 0; i < list1.size() - 1; i++) {
for (int j = list1.size() - 1; j > i; j--) {
if (list1.get(j).equals(list1.get(i))) {
list1.remove(j);
}
}
}
System.out.println("第一种耗时:" + (System.currentTimeMillis() - startTime1) + "毫秒");
//---------------------Set
List<String> list2 = new ArrayList<>();
CollectionUtils.addAll(list2, new Object[list.size()]);
Collections.copy(list2, list);
long startTime2 = System.currentTimeMillis();
HashSet<String> h = new HashSet<>(list2);
list2.clear();
list2.addAll(h);
System.out.println("第二种耗时:" + (System.currentTimeMillis() - startTime2) + "毫秒");
//-------------------1.8流
List<String> list3 = new ArrayList<>();
CollectionUtils.addAll(list3, new Object[list.size()]);
Collections.copy(list3, list);
long startTime3 = System.currentTimeMillis();
list3=list3.stream().distinct().collect(Collectors.toList());
System.out.println("第三种耗时:" + (System.currentTimeMillis() - startTime3) + "毫秒");
}
}
执行结果:
第一种耗时:626毫秒
第二种耗时:6毫秒
第三种耗时:63毫秒
结论:
冒泡就算了吧。。。。第二种和第三种耗时还是有比较明显差距的,如果单纯去重不做其他操作应当使用hashset方法,如果在去重操作时还要加入其他处理,可以考虑stream的方法。