Collections Framework

 集合-有時也稱爲容器-組合多個元素到單一單元。
 用於store,retrieve,manipulate,communicate aggregate data。
 如:一手撲克牌(單張撲克牌集合),一個郵件文件夾(一組信件),一個電話本(映射名字到電話號碼)。
 
 集合框架是一個一致的架構用於表示且操做集合。包含以下:
 接口:這些都是表示集合的抽象數據類型。接口容許集合獨立操做的細節表示。在OO語言中,接口一般造成一個層次結構。
 實現:這些都是集合接口的具體實現,從本質上說,它們是可重用的數據結構。
 算法:這些方法執行有用的計算。好比搜索和排序,在一個實現集合接口的對象。從本質上說,它們是可重用功能。
 
 java 集合框架的特性:
  減小編程工做
  提升程序開發的速度和質量
  容許不相關的api之間的互操做
  減小努力學習和使用新的api
  減小努力設計新的api
  培養軟件重用
  
 
 爲了保持核心集合接口數量可管理,java沒有爲每種集合類型的變體提供分離的接口(如變體可能包含不可變,固定大小和只追加),代替,在每一個集合接口中的修改操做設計成可選,
 給定一個實現可能選擇不支持全部的操做,若是一個不支持的操做被調用,集合拋出UnsupportedOperationException,實現負責記錄的可選的業務支持,全部的Java平臺的通用實現都支持全部可選操做。
java

Collection Interface
    Collection 表示一組對象,這些對象也稱爲 collection 的元素。此接口一般用來傳遞 collection,並在須要最大廣泛性的地方操做這些 collection。
    一般,全部通用Collection的實現有一個帶Collection參數的構造器,這個構造器被稱爲一個轉換構造器,初始化一個新的Collection去包含指定Collection的全部元素,
    不管給定集合的子接口或實現類型。換言之,它容許你轉換集合的類型。
    
    遍歷集合
        一、使用聚合操做;二、使用for-each語句;三、使用Iterators
        Iterator是你能夠遍歷一個collection而且有選擇的從集合中移除元素。
        若是迭代中有更多的元素,hasNext方法返回true,next方法返回迭代中的下一個元素。
        remove方法移除經過next方法返回最後一個元素。remove方法只有每次調用next方法後被調用,如違反這個規則則拋出異常。
        注意,Iterator.remove是僅有安全方式修改一個Collection在迭代時,若是底層迭代以任何其餘方式而集合被修改則行爲是未指定的。
        有時你須要使用Iterator代替for-each語句:
            移除當前元素。for-each語句隱藏了迭代器,所以你不能調用remove。因此for-each語句不適應於過濾。
            並行的遍歷多個Collections
        下面方式說明如何使用Iterator過濾一個任意Collection,遍歷該集合移除指定元素:
        static void filter(Collection<?> c) {
            for (Iterator<?> it = c.iterator(); it.hasNext(); )
                if (!cond(it.next()))
                    it.remove();
        }
        
        強大批量操做的例子,考慮從一個Collection,c中移除全部指定元素e的實例:
        c.removeAll(Collections.singleton(e));
        更具體的說,假如你想要移除一個Collection中全部null元素:
        c.removeAll(Collections.singleton(null));
        Collections.singleton是一個靜態工廠方法,返回一個僅包含指定元素不可變的Set。
        
Set Interface
    不能包含重複元素的Collection。它是數學模型Set的抽象。該接口僅包含繼承Collection的方法且添加禁止重複元素的限制。
    Set在equals和hashCode操做行爲上添加更強的約定,容許Set的實例能夠比較的即便它們的實現不一樣。若是2個Set實例包含相同的元素,則2個實例是相等的。
    java提供3種Set的實現:HashSet、TreeSet和LinkedHashSet。HashSet在一個hash table中存儲它的元素,也是表現最好的實現;可是它不保證有關的順序迭代。
    TreeSet在一個red-black tree中存儲它的元素,元素的順序是基於它們的值,比HashSet慢得多。
    LinkedHashSet用鏈表進行優化設計hash table的實現,元素的順序是基於元素插入的順序。
    
    假如你有Collection,c,而且你想要建立另外一個Collection包含相同元素但排除重複元素,如:
    Collection<Type> noDups = new HashSet<Type>(c);
    Collection<Type> noDups = new LinkedHashSet<Type>(c);//保留原始元素的順序
算法

List Interface

    是一個排序的集合(有時也稱爲序列)。Lists中能夠包含重複元素,除了繼承Collection操做外,List接口包含以下操做:
    位置訪問:操做元素是基於數值的位置,如get,set,add,addAll,和remove
    搜索:在列表中搜索指定的對象,並返回其數值的位置,如indexOf,lastIndexOf
    迭代:繼承Iterator語義提供list順序的迭代,如listIterator
    查看範圍:sublist方法執行任意範圍的操做
    
    remove方法老是從list中移除第一個出現的指定元素;add/addAll老是添加新元素到list的末尾。

    同Set同樣,List在equals和hashCode操做行爲上添加更強的約定,容許Set的實例能夠比較的即便它們的實現不一樣。若是2個Set實例包含相同的元素,則2個實例是相等的。
    
    位置訪問和搜索操做
        基本的位置訪問操做包括get,set,add,addAll,和remove(set和remove操做返回將被覆蓋or移除的舊值),indexOf和lastIndexOf返回list中第一個or最後一個指定元素。
        addAll從指定位置開始插入指定Collection中全部的元素。元素插入的順序則是經過Collection的迭代返回的順序。
    
    Iterators
        經過list的iterator方法返回適當順序的list的元素。list提供更強大的iterator,稱爲(ListIterator)。你能夠在任何一個方向遍歷列表,遍歷中修改列表,並得到迭代器的當前位置。 ListIterator從Iterator繼承hasNext,next,remove。hasPrevious,previous相似於hasNext,next。前面的的操做引用隱式光標以前的元素,然後面的則引用光標以後的元素。previous向後移動光標,next向前移動光標。更直接的說,光標老是位於2個元素之間(一個調用previous將返回的元素和一個調用next將返回的元素)。N + 1的有效索引值對應於元素之間N + 1個間隙,從第一個元素前面的間隙到最後一個元素的間隙。編程


        調用next和previous能引發混亂,須要當心使用。api

    nextIndex 方法返回隨後調用next返回元素的索引號,previousIndex方法返回隨後調用previous返回元素的索引號。這些調用一般用來報告某些元素被查找的位置or記錄ListIterator的位置以即可以使用相同的位置建立另外一個ListIterator
     nextIndex返回的值老是大於previousIndex返回的值,這意味着2種邊界行爲:
        (1)、當光標位於初始元素以前,調用previousIndex返回-1
        (2)、當光標位於最後元素以後,調用nextIndex返回list.size()
    以下一種可能實現List.indexOf:
        public int indexOf(E e) {
            for(ListIterator<E> it = listIterator (); it.hasNext();)
                if(e == null ? It.next == null : e.equals(it.next())
                    return it. previousIndex();//返回向前檢查過的元素的索引
            return -1;
        }
        
    iterator接口提供remove方法用於從Collection中移除由next返回最後元素。 ListIterator的操做移除由next/previous返回最後元素,ListIterator還提供2個額外的操做來修改list(set/add),set方法使用指定元素覆蓋由next/previous返回最後元素。如:
        public static <E> void replace(List<E> list, E val, E newVal) {
            if(val == null ? It.next == null : val.equals(it.next())
                it.set(newVal);
        }
add方法在當前光標以前插入一個新的元素。如:
        public static <E> void replace(List<E> list, E val,
                List<? extends E> newVals) {
            if(val == null ? It.next == null : val.equals(it.next())
                it.remove();
                for(E e: newVals)
                    it.add(e);
        }    安全

rang-view
    subList(int fromIndex, int toIndex)返回list試圖,從formIndex(包括)到toIndex(不包括)的範圍list的分區
    返回的list是經過在subList調用時由List備份的,全部前者的改變會影響到後者。
    一般能夠再一個range中查找一個元素,如:
    int i = list.subList(fromIndex, toIndex).indexOf(obj);
    int j = list.subList(fromIndex, toIndex).lastIndexOf(obj);
    注意,在subList視圖中查找指定元素的索引號,而不是後面的List
數據結構

相關文章
相關標籤/搜索