posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          集合Collection框架

          Posted on 2007-09-20 23:06 semovy 閱讀(358) 評論(0)  編輯  收藏 所屬分類: JAVA基礎
          一直都不敢對這個系列的類入手,首先感覺太復雜了,但是我最終還是說服了自己咬咬牙,還是來看看,先在網上搜了一下關于這個方面的
          文章感覺是這個方面的知識跟一些數學知識聯系起來看還是可以找到頭緒的。
          首先就是集合的概念包括一些集合的運算,象交,并,包含的關系,映射也是屬于集合但是java里的映射Map接口并不是繼承自Collection。
          好了,首先我們來看看
          Collection接口:
              Collection接口用于表示任何對象或元素組。想要盡可能以常規方式處理一組元素時,就使用這一接口。
              該接口支持如添加和除去等基本操作。設法除去一個元素時,如果這個元素存在,除去的僅僅是集合中此元素的一個實例。
           boolean add(Object element)
           boolean remove(Object element)
              Collection接口還支持查詢操作:
           int size()
           boolean isEmpty()
           boolean contains(Object element)
           Iterator iterator()
              Collection接口支持的其它操作,要么是作用于元素組的任務,要么是同時作用于整個集合的任務。
           boolean containsAll(Collection collection)
           boolean addAll(Collection collection)
           void clear()
           void removeAll(Collection collection)
           void retainAll(Collection collection)
              containsAll()方法允許您查找當前集合是否包含了另一個集合的所有元素,即另一個集合是否是當前集合的
           子集。其余方法是可選的,因為特定的集合可能不支持集合更改。addAll()方法確保另一個集合中的所有
           元素都被添加到當前的集合中,通常稱為并。clear()方法從當前集合中除去所有元素。removeAll()方法類似于
           clear(),但只除去了元素的一個子集。retainAll()方法類似于removeAll()方法,不過可能感到它所做的與前
           面正好相反:它從當前集合中除去不屬于指定集合的元素,即交。
          List接口:
            繼承Collection以實現一個允許有重復項的有序集合,添加了索引項,和ListIterator迭代器(可以雙向迭代)
            另外函數subList(int from, int end)遵循前包后不包的原則(也就是返回的List只包含下標為
            第from,from+1,...end-1個元數),
            實現類:
              ArrayList,LinkedList,區別在于前者是基于數組來實現的,后者是基于鏈表來實現(里面有個內部元素類
              Entry)導致前面的隨即訪問較后者要快,但是插入、移除操作不及后面的快,另后者操作方法也更靈活,
              包括前者沒有的add,get,remove-([First][Last]),這些方法可以作為堆棧,隊列,雙向隊列使用。
              Vector,可以實現可增長的對象數組。與數組一樣,它包含可以使用整數索引進行訪問的組件。但是,
              Vector 的大小可以根據需要增大或縮小,以適應創建 Vector 后進行添加或移除項的操作。 并發編程不安全
            這里講一下1.5版本和以前的版本不同的地方。
            往一個ArrayList中加入一個整數,1.5版本以前的版本寫法是:
            List list = new ArrayList();
           list.add( new Integer( 10 ) );
            而在1.5版本中可以寫為:
           list.add( 10 );
             因為,在1.5版本中,對一個整數進行包裝,使之成為一個Integer對象(即包裝,boxing),然后加入到一個
              ArrayList中的做法被認為是沒有必要的,反之,解包(unboxing)的做法也是沒有必要的,這樣的代碼只是增
            加了程序的文本長度而已,所以1.5版本支持了自動包裝和解包操作,對于bool/Boolean,byte/Byte,
            double/Double,short/Short,int/Integer,long/Long,float/Float的相應包裝/解包操作都進行了支持,
            從而使代碼變得簡單。


          Set接口:(共15個函數)
            繼承Collection,不允許重復的項,沒有添加任何新的方法,只是在添加的函數中依賴元素equals()方法檢
            查等同性。
            實現類:
              HashSet:為快速查找而設計的Set,存入的對象必須實現hashCode();
              TreeSet:保持次序的Set ,底層為樹結構,使用它可以從Set中提取有序的序列,
              LinkedHashSet:具有HashSet的查詢速度,且內部使用鏈表維護元素的順序。
             

          Map接口:
            首先說明的是與Collection沒有任何關系,反映的是一對映射關系的集合,該接口描述了從不重復的鍵到值
            的映射。我們可以把這個接口方法分成三組操作:改變、查詢和提供可選視圖。
            改變操作允許您從映射中添加和除去鍵-值對。鍵和值都可以為null。但是,您不能把Map作為一個鍵或值添
            加給自身。
            Object put(Object key, Object value)
            Object remove(Object key)
            void putAll(Map mapping)
            void clear()
            查詢操作允許您檢查映射內容:
            Object get(Object key)
            boolean containsKey(Object key)
            boolean containsValue(Object value)
            int size()
            boolean isEmpty()
            最后一組方法允許您把鍵或值的組作為集合來處理。
           public Set keySet()
           public Collection values()
           public Set entrySet()
            因為映射中鍵的集合必須是唯一的,您用Set支持。因為映射中值的集合可能不唯一,您用Collection支持。
            最后一個方法返回一個實現Map.Entry接口的元素Set。
            實現類:
              TreeMap:基于紅黑樹的實現,查看鍵或鍵值對時,他們能會被排序,TreeMap是唯一一個帶subMap()的Map,
               它可以返回一個子樹。
              HashMap:是Map基于散列表的實現,插入和查詢“鍵值對”的開銷是固定的,可以通過構造起設置容量和負載
                      因子(load factor),以調整容器性能。
              LinkedHashMap:Map 接口的哈希表和鏈接列表實現,具有可預知的迭代順序。此實現與 HashMap 的不同
               之處在于,后者維護著一個運行于所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,該迭
               代順序通常就是將鍵插入到映射中的順序(插入順序)。注意,如果在映射中重新插入鍵,則插
               入順序不受影響。(如果在調用 m.put(k, v) 前 m.containsKey(k) 返回了 true,則調用時會
               將鍵 k 重新插入到映射 m 中。)
              這里要解釋一下loadfactor,默認為0.75,負載因子是哈希表在其容量自動增加之前可以達到多滿的一種
              尺度。當哈希表中的條目數超出了加載因子與當前容量的乘積時,則要對該哈希表進行rehash操作
              (即重建內部數據結構),從而哈希表將具有大約兩倍的桶數。
           通常,默認加載因子 (.75)在時間和空間成本上尋求一種折衷。加載因子過高雖然減少了空間開銷,
           但同時也增加了查詢成本(在大多數 HashMap 類的操作中,包括 get和put操作,都反映了這一點)。
           在設置初始容量時應該考慮到映射中所需的條目數及其加載因子,以便最大限度地減少 rehash
           操作次數。如果初始容量大于最大條目數除以加載因子,則不會發生 rehash 操作。


          總結java.util包里的東東包括一些集合框架方面的,日歷,時間方面,及正則表達式,模式匹配等方面的類 

          主站蜘蛛池模板: 永仁县| 青川县| 临洮县| 五家渠市| 洪江市| 湘乡市| 南城县| 梨树县| 肃宁县| 凤山市| 苍梧县| 平阴县| 唐海县| 隆回县| 富锦市| 丹寨县| 芜湖县| 马尔康县| 射阳县| 桃源县| 镇坪县| 文安县| 明溪县| 龙陵县| 原平市| 嘉祥县| 兰考县| 江油市| 石屏县| 玛曲县| 罗平县| 兰州市| 江口县| 潮安县| 江北区| 三明市| 阿瓦提县| 汉川市| 宝坻区| 蒙自县| 青岛市|