Set 集合是無序不可以重復的的、List 集合是有序可以重復的。

Java 集合:HashSet 與 hashCode、equals 博客里面已經說到這個問題,但是解釋的還是不夠清楚。


看一個小例子:


package mark.zhang;

import java.util.ArrayList;
import java.util.HashSet;

public class Test {

    public static void main(String[] args) {
        ArrayList<Integer> loadsList = new ArrayList<Integer>();
        loadsList.add(1);
        loadsList.add(2);
        loadsList.add(0);
        loadsList.add(3);
        loadsList.add(2);
        loadsList.add(1);
        loadsList.add(3);
        loadsList.add(5);
        loadsList.add(0);
        System.out.println("the arrayList: " + loadsList);
        
        HashSet<Integer> loadsSet = new HashSet<Integer>();
        loadsSet.add(1);
        loadsSet.add(2);
        loadsSet.add(0);
        loadsSet.add(3);
        loadsSet.add(2);
        loadsSet.add(1);
        loadsSet.add(3);
        loadsSet.add(5);
        loadsSet.add(0);
        System.out.println("the hashSet:   " + loadsSet);
    }
}

代碼很簡單,分別使用 ArrayList、HashSet 裝載 Integer 數據,然后打印集合的內容。



List 中的元素是按照 add 順序加載的,并且里面有重復的元素。這就是有序可重復的意思。

Set 中的元素并沒有按照 add 順序加載的,并且里面沒有重復的元素。這就是無序不可重復的意思。


換句話說,有序不是指按照字母順序或者數字大小來排列的,重復是指元素之間 equals 為 true。


這里選擇 Integer,因為其重寫了 equals 方法。


那麼,我們思考一個問題:如何去掉 List 里面重復的元素?參考代碼:


package mark.zhang;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        ArrayList<Integer> loadsList = new ArrayList<Integer>();
        loadsList.add(1);
        loadsList.add(2);
        loadsList.add(0);
        loadsList.add(3);
        loadsList.add(2);
        loadsList.add(1);
        loadsList.add(3);
        loadsList.add(5);
        loadsList.add(0);
        System.out.println("remove before--- the arrayList: " + loadsList);
        // remove the repeated element
       
// rmRepeatedElement(loadsList);
        rmRepeadtedElementByOrder(loadsList);
        System.out.println("remove after--- the arrayList: " + loadsList);
        
    }

    public static void rmRepeatedElement(List<Integer> list) {
        HashSet<Integer> loadsSet = new HashSet<Integer>(list);
        list.clear();
        list.addAll(loadsSet);
    }
    
    public static void rmRepeadtedElementByOrder(List<Integer> list) {
        HashSet<Integer> loadsSet = new HashSet<Integer>();
        ArrayList<Integer> loadsList = new ArrayList<Integer>();
        for(Iterator<Integer> iterator = list.iterator(); iterator.hasNext();) {
            Integer element = iterator.next();
            if(loadsSet.add(element)) {
                loadsList.add(element);
            }
        }
        
        list.clear();
        list.addAll(loadsList);
    }
    
}


移除相同元素之后,還是按照原來的排列順序。