標籤:utils long private 縮減 重複數 四種 user com 相同
之前面試被問到關於java如何去重的問題,當時沒怎麼留意,今天剛好項目中用到了,所以記錄一下。
實體類:
/** * 使用者類 */class User{private String username;private String password; public User(String username, String password) { this.username = username; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
測試類別:
public static void main(String[] args) { ArrayList<User> arrayList = new ArrayList<>(); long currentTimeMillis = System.currentTimeMillis(); int f = 100000; for(int i = 0; i < f; i++){ arrayList.add(new User(""+i, "7878")); } Iterator<User> iterator = arrayList.iterator(); Set<String> hashSet = new HashSet<>(); LinkedList<User> newList = new LinkedList<>(); // 第一種:set集合去重,不改變原有的順序,根據username唯一標識去重 while (iterator.hasNext()){ User u = iterator.next(); // 根據set不能存放相同值的特性 if(!StringUtils.isEmpty(u.getUsername())){ if (hashSet.add(u.getUsername())){ // 將其重新放入在LinkedList中 newList.add(u); } } } long currentTimeMillis1_1 = System.currentTimeMillis(); System.out.println("第一種set集合去重,不改變原有的順序:"+(currentTimeMillis1_1 - currentTimeMillis)); // 第二種:遍曆後判斷賦給另一個list集合,利用List的contains方法迴圈遍曆 List<User> listNew=new ArrayList<>(); for (User str:arrayList) { if(!listNew.contains(str)){ listNew.add(str); } } long currentTimeMillis1_2 = System.currentTimeMillis(); System.out.println("第二種:遍曆後判斷賦給另一個list集合,利用List的contains方法迴圈遍曆:"+(currentTimeMillis1_2 - currentTimeMillis1_1)); // 第三種:set去重 Set set = new HashSet(); List<String> listNew2=new ArrayList<>(); set.addAll(arrayList); listNew2.addAll(set); long currentTimeMillis1_3 = System.currentTimeMillis(); System.out.println(" 第三種:set去重"+(currentTimeMillis1_3 - currentTimeMillis1_2)); // 第四種:set去重(縮減為一行) List<String> listNew3=new ArrayList<>(new HashSet(arrayList)); long currentTimeMillis1_4 = System.currentTimeMillis(); System.out.println("第四種:set去重(縮減為一行)"+(currentTimeMillis1_4 - currentTimeMillis1_3)); // 第五種:去重並按自然順序排序 /* TreeSet treeSet = new TreeSet(arrayList); List tempList = new ArrayList(); tempList.addAll(treeSet); //List<User> listNew4=new ArrayList<>(new TreeSet<User>(arrayList)); long currentTimeMillis1_5 = System.currentTimeMillis(); System.out.println(currentTimeMillis1_5 - currentTimeMillis1_4);*/ // 第六種:雙重for迴圈,去重 for(int i = 0 ; i < arrayList.size() - 1; i ++){ for(int j = arrayList.size() - 1; j > i; j --){ if(arrayList.get(j).equals(arrayList.get(i))){ arrayList.remove(j); } } } long currentTimeMillis1_6 = System.currentTimeMillis(); System.out.println("第六種:雙重for迴圈,去重"+(currentTimeMillis1_6 - currentTimeMillis1_4)); // 第七種:利用HashSet不能添加重複資料的特性 由於HashSet不能保證添加順序,所以只能作為判斷條件 HashSet<User> set2 = new HashSet<>(arrayList.size()); List<User> result = new ArrayList<>(arrayList.size()); for (User str3 : arrayList) { if (set2.add(str3)) { result.add(str3); } } arrayList.clear(); arrayList.addAll(result); long currentTimeMillis1_7 = System.currentTimeMillis(); System.out.println("第七種:利用HashSet不能添加重複資料的特性 由於HashSet不能保證添加順序,所以只能作為判斷條件"+(currentTimeMillis1_7 - currentTimeMillis1_6)); // 第八種:利用LinkedHashSet不能添加重複資料並能保證添加順序的特性 LinkedHashSet<User> set5 = new LinkedHashSet<>(arrayList.size()); set5.addAll(arrayList); arrayList.clear(); arrayList.addAll(set5); long currentTimeMillis1_8 = System.currentTimeMillis(); System.out.println("第八種:利用LinkedHashSet不能添加重複資料並能保證添加順序的特性"+(currentTimeMillis1_8 - currentTimeMillis1_7)); }
控制台輸出:
提示:在資料量大的情況下,最好不要使用第二種和第六種,速度太慢了
至於效率問題大家自己根據實際情況選擇吧。
java之去重方式,以及效率問題