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

          集合Collection框架

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


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

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


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

          主站蜘蛛池模板: 那坡县| 桂东县| 平安县| 清河县| 和田县| 玉山县| 龙山县| 尼勒克县| 封丘县| 红河县| 冀州市| 南宫市| 高雄县| 肥乡县| 策勒县| 儋州市| 蕲春县| 苍南县| 克什克腾旗| 大厂| 峨山| 衡山县| 集贤县| 蒙自县| 柘荣县| 温宿县| 上犹县| 祥云县| 博兴县| 宝兴县| 军事| 华安县| 梧州市| 安新县| 上虞市| 信宜市| 阳东县| 姚安县| 四川省| 伊宁县| 墨江|