java之集合框架使用細節及常用方法

凌.風發表於2014-12-23
集合類的由來: 
 物件用於封裝特有資料,物件多了需要儲存,如果物件的個數不確定。
 就使用集合容器進行儲存。
集合特點:
1,用於儲存物件的容器。
2,集合的長度是可變的。
3,集合中不可以儲存基本資料型別的值。
 
集合容器因為內部的資料結構不同,有多種具體容器。
不斷的向上抽取,就形成了集合框架。
 
框架的頂層是Collection介面,定義了集合框架中共性的方法.
 
Collection的常見方法
 
1,新增
 boolean add(E e);
 boolean addAll(Collection<? extends E> c)
2,刪除
 boolean remove(E e);
 boolean removeAll(Collection<?> c) ;
 void clear();
3,判斷
 boolean contains(Object o)
 boolean containsAll(Collection<?> c)
 boolean isEmply();
4,獲取
 int size();
 Iterator<E> iterator();
5,其他
 boolean retainAll(Collection coll);
 Object[] toArray();
 
Collection下常用的子介面
List:有序(存入與取出的順序一致),元素都有索引(角標),元素可以重複。
Set: 元素不能重複,無序。
 
List特有常見方法
    有一個共性特點就是都可以操作角標。
 
1,新增
    void add(index,element);
    void add(index,collection);
2,刪除
    Object remove(index);
3,獲取
    Object get(index);
    int indexOf(object);
    int lastIndexOf(object);
    Last subList(from,to);
4,修改
    Object set(index,element);
 
ListIterator迭代器可實現對list集合進行增刪改查。
 
List集合常用實現子類:
Vector:內部是陣列資料結構。是同步的。(幾乎不怎麼用,但是比較特殊),可變陣列,100%延長。
                增刪,查詢都很慢。
ArrayList:內部是陣列資料結構,是不同步的。替代了Vector。
                如在多執行緒中,一般採用ArrayList加鎖的形式實現。
                可增長陣列,50%延長。
                查詢元素的速度很快。
LinkedList:內部是連結串列資料結構,非同步的。增刪元素的速度很快。
 
LinkedList新老方法對比:
 
    addFirst();
    addLast();
jdk1.6
    offerFirst();
    offerLast();
 
    getFirst();//獲取但不移除,如果連結串列為空,丟擲NoSuchElementExcetion
    getLast();
jdk1.6
    peekFirst();//獲取但不移除,如果連結串列為空,返回null
    peekLast();
 
    removeFirst();//獲取並移除,如果連結串列為空,丟擲NoSuchElementExcetion
    removeLast();
jdk1.6
    pollFirst();  獲取並移除此列表的第一個元素;如果此列表為空,則返回 null
    pollLast();
 
Set :元素不可以重複,是無序的。
        Set介面中的方法和Collection中的一致。
常用子類:
        HashSet:內部資料結構是雜湊表,是不同步的,儲存元素的時候,使用的是元素的hashCode方法來確定位置,如果位置相同,再通過元素的equals方法來確定內容是否相同。
                雜湊表判定元素是否相同
                        1,判斷的是兩個元素的雜湊值是否相同,如果相同,再判斷兩個物件的內容是否相同。
                        2,判斷雜湊值相同,其實判斷的是物件的hashCode得方法,判斷內容相同,用的是equals方法。
                        注意:如果雜湊值不同,是不需要判斷equals的。
 
        LinkedHashSet:這個可以是有序的,與連結串列結合使用。
 
        TreeSet:可以對Set集合中的元素進行排序,是不同步的。
                    判斷元素唯一性的方式:就是比較方法的返回結果是否是0,是0就是相同的元素。compareTo方法比較。
 
        TreeSet對元素進行排序的方式一:
            讓元素自身具備比較功能,元素就需要實現Compareable方法覆蓋compareTo方法。
            
            如果不要按照物件中具備的自然順序進行排序,如果物件中不具備自然順序,即這個物件不是我們自己定義的。那麼我們可以使用TreeSet集合中的第二種排序方式:
            讓集合自身具備比較功能,定義一個類實現Comparator介面,覆蓋compare方法。
            將該類的物件作為引數傳遞給TreeSet集合的建構函式。
 

泛型
    jdk1.5出現的安全機制。
好處:
    1、將執行時期的問題ClassCastException轉換成編譯時的問題。
    2、避免了強制換換的麻煩。
<>的應用場景:當操作的引用資料型別不確定的時候。就使用<>將要操作的引用資料型別傳入即可。其實<>就是一個用於接收具體引用資料型別的引數範圍。
 
在程式中,只要用到了帶有<>的類或者介面,就要明確傳入的具體引用資料型別。
 
泛型技術是給編譯器使用的技術,用於編譯時期,確保了型別的安全。
執行時,會將泛型去掉,生成的class檔案中是不帶泛型的。
生成的class檔案中不帶泛型的原因是為了相容執行的類載入器。
 
泛型的補償:在執行時,通過獲取元素的型別進行轉換動作。不用使用者在強制轉換了。
在jdk1.5後,使用泛型來接收類中藥操作的引用資料型別。
當類中操作的引用資料型別不確定的時候,我們就使用泛型來表示。
 
注:當方法靜態時,不能訪問類上定義的泛型。如果靜態方法使用泛型,只能將泛型定義在方法上。將泛型定義在方法上時,必須要宣告在返回值型別的前面。
    例:public static <T> void method (Y y){}
泛型的萬用字元:?代表的是未知的型別。
    可以對型別進行限定:
        ? extends E : 接收E型別或者E的子型別。上限
        ? super E : 接收E型別或者E的富型別。下限
            一般在儲存元素的時候我們都是使用上限,因為這樣取出都是按照上限型別來運算的,不會出現型別安全隱患。
            一般我們對集合中的元素進行取出操作時,我們一般使用下限。
 
 
 
Map:一次新增一對元素。Collection是一次新增一個元素。
            Map集合也稱為雙列集合,Collection集合稱為單列集合。
            其實Map集合儲存的就是鍵值對。
            Map集合必須保證鍵的唯一性。
            
常用方法
1,新增
        value put(key,value):返回前一個和key關聯的值,如果沒有則返回null
2,刪除
        void clear():清空map集合。
        value remove(key):根據指定的key刪除這個鍵值對
3,判斷
        boolean containKey(key)
        boolean containValue(value)
        boolean isEmpty();
4,獲取
        value get(key);通過鍵獲取值,如果沒有該鍵返回null
                                當然可以通過返回null來判斷是否包含指定鍵
        int size()獲取鍵值對個數。
    
 
取出Map集合中的所有值的方法
 
    方法一:原理就是通過keySet方法獲取map中所有的鍵所在的Set集合,再通過Set的迭代器獲取到每一個鍵,再對每一個鍵獲通過map集合的get方法取其對應值即可。
    方法二:通過map集合的entryset方法也可取出map集合當中所有的鍵值對,返回的就是Map.Entry物件,再通過Map.Entry物件的getkey和getvalue方法就可以取出對應的鍵和值。
    方法三:通過map集合的values方法也可獲取所有值。
 
Map集合常用的子類:
    Hashtable:內部結構是雜湊表,是同步的。不允許null作為鍵,null做為值
                Hashtable子類:Propertise:用來儲存鍵值對型的配置檔案的資訊,可以和IO技術相結合。
    HashMap:內部結構是雜湊表,不是同步的。允許null作為鍵,null做為值
    TreeMap:內部結構是二叉樹,不是同步的,可以對Map集合中的鍵進行排序。
 
 

集合的一些技巧:
    需要唯一時用Set
        且需要指定順序時:TreeSet
        不需要指定順序時:HashSet
        但是想要一個和儲存一致的順序(有序):LinkedHashSet
    不需要唯一時用List
        需要頻繁增刪動作
                需要:LinkedList
                不需要:ArrayList
 
如何記錄每一個容器的結構和所屬體系
            最簡單的就是看名字。
 
List 
       --ArrayList
       --LinkedLst
Set
        --HashSet
        --TreeSet
字尾名就是該集合所屬的體系。
字首名就是該集合所屬的資料結構。
看到array:想到的就是陣列,查詢速度快。因為有角標是連續的記憶體地址。
看到link:想到的就是連結串列,增刪動作的速度快,而且要想到add get remove+first/last的方法
看到hash:想到的就是雜湊表,那麼就具有唯一性,而且要想到元素需要覆蓋hashcode方法和equals方法
看到tree:想到的就是二叉樹,接下來想到的就是排序,然後就是兩個介面Comparable,Comparator
 
而且通常這些常用的集合容器都是不同步的。
 
 
 
 

相關文章