java之去重方式,以及效率問題

來源:互聯網
上載者:User

標籤: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之去重方式,以及效率問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.