测试数据如下
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("张三");//重复的数据
list.add("赵六");
System.out.println("oldList = "+list);
list = removeDuplicate(list);
System.out.println("newList = "+list);
}
①使用HashSet去重
public static List<String> removeDuplicate(List<String> list){
HashSet<String> hs = new HashSet<>();
hs.addAll(list);
list.clear();
list.addAll(hs);
return list;
}
结果(缺点:返回的list是顺序和原顺序不一定相同,若需要顺序可以使用LinkedHashSet)
②Iterator遍历去重,结果有序
public static List<String> removeDuplicate(List<String> list){
Set<String> set = new HashSet<>();
List<String> newList = new ArrayList<>();
for(Iterator<String> it = list.iterator(); it.hasNext();){
String str = it.next();
if (set.add(str)){
newList.add(str);
}
}
list.clear();
list.addAll(newList);
return list;
}
③遍历list利用contains进行判断 (结果有序,效率极低,不推荐)
public static List<String> removeDuplicate(List<String> list){
List<String> newList = new ArrayList<String>(list.size());
for (String str : list) {
if (!newList.contains(str)) {
newList.add(str);
}
}
list.clear();
list.addAll(newList);
return list;
}
效率测试
public static void main(String[] args) {
final List<String> list = new ArrayList<String>();
for (int i = 0; i < 1000; i++) {
int number = (int)(Math.random()*1000);
list.add("字符串" + number + "号");
}
//第一方式HashSet
long time = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
removeDuplicate1(list);
}
long time1 = System.currentTimeMillis();
System.out.println("HashSet time1:"+(time1-time));
//第二方式LinkedHashSet
for (int i = 0; i < 10000; i++) {
removeDuplicate2(list);
}
long time2 = System.currentTimeMillis();
System.out.println("LinkedHashSet time2:"+(time2-time1));
//第三方式iterator
for (int i = 0; i < 10000; i++) {
removeDuplicate3(list);
}
long time3 = System.currentTimeMillis();
System.out.println("iterator time3:"+(time3-time2));
//第四方式contain
for (int i = 0; i < 10000; i++) {
removeDuplicate4(list);
}
long time4 = System.currentTimeMillis();
System.out.println("contain time4:"+(time4-time3));
}
结果