Java基礎:Collection—List&Set

List和Set:數組

List能夠將元素維護在特定的序列中。它的特色是有序,容許重複元素出現。最多見的List的實現類是:ArrayList。spa

Set的特色是:無序,不保存重複元素。當嘗試將重複的元素添加到Set中,它就會阻止這種重複現象。Set最多見的實現是HashSet。code

 ArrayList更適合順序的訪問元素,它更像一個可變長度的數組。可是想要在List中間插入或刪除元素時相對會比較慢。HashSet能夠很快的查詢到某個元素是否在Set中,所以能夠很快的實現快速查詢。對象

 

遍歷打印ArrayList的方法:blog

public void firstWayPrintList() {
        for(int i=0; i<list.size();i++){
            System.out.print(list.get(i) + " ");
        }
        System.out.print('\n');
    }

 public void secondWayPrintList() {
        for(Integer i: list){
            System.out.print(i + " ");
        }
        System.out.print('\n');
    }

 public void thirdWayPrintList(){
        for(Iterator<Integer> iterator = list.iterator(); iterator.hasNext();){
            System.out.print(iterator.next() + " ");
        }
        System.out.print('\n');
    }

遍歷打印HashSet的方法:接口

public void firstWayPrintSet(){
        for(Integer i: set){
            System.out.print(i + " ");
        }
         System.out.print('\n');


    }

public void secondWayPrintSet(){
        for(Iterator<Integer> iterator = set.iterator(); iterator.hasNext();){
            System.out.print(iterator.next() +  " ");
        }
        System.out.print('\n');
    }

可見遍歷得到ArrayList中各個元素的方法有三種:for循環,foreach,iterator;而遍歷得到HashSet元素的方法只有兩種:foreach,iterator。緣由就在於HashSet的無序存儲的特色。HashSet採用了hash,也就是散列的方法來存儲元素,每一個特定的元素對應一個HashCode,這就是爲何它不能存儲相同的元素。同時因爲採用hash,元素的存儲並無遵循某一特定的順序,因此不可以在for循環中經過get(i)方法來獲得其中的第i個元素。get

如何使Set可以有序存儲?hash

那若是我想要一個Set它可以保持元素添加時的順序應該如何呢?答案是使用LinkedHashSet。LinkedHashSet內部使用了鏈表來維護元素的順序,同時它也具備HashSet的快速查詢的特色。it

如何消除List中的重複元素?for循環

我已經有了一個List,可是我想消除裏面的重複元素,快速的作法是:利用Set。

public void deleteDuplicate(){
        Set<Integer> set = new HashSet<Integer>(list);
        list.clear();
        list.addAll(set);
        for(Integer i: list){
            System.out.print(i + " ");
        }
    }

另外兩個須要注意的地方:

1.在建立一個List或是Set時,良好的代碼風格是:聲明一個具體類的對象(ArrayList/HashSet),將其轉型爲對應的接口(List/Set),而後在其他的代碼中都使用這個接口。個人代碼中就是這樣作的,這樣作的好處是:若是之後我須要改變個人實現,只須要在建立的地方進行修改。

2.使用泛型:在聲明的時候在尖括號中定義類型參數(HashSet<String>),這個類型參數指定了能夠被放到這個容器中的對象的類型。經過使用泛型,就能夠在編譯階段防止將錯誤的類型的對象放到容器當中。

相關文章
相關標籤/搜索