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

          數(shù)組 Collection List Set Map的比較

          Posted on 2008-03-02 17:50 semovy 閱讀(2085) 評(píng)論(1)  編輯  收藏 所屬分類: JAVA基礎(chǔ)

          數(shù)組
          數(shù)組和其它容器的區(qū)別主要有三方面:效率,類型,和保存基本類型的能力.在Java中,數(shù)組是一種效率很高的存儲(chǔ)和隨機(jī)訪問對(duì)象引用序列的方式.數(shù)組是一個(gè)簡(jiǎn)單的線性序列,因此訪問速度很快,但也損失了其它一些特性.創(chuàng)建一個(gè)數(shù)組對(duì)象后,大小就固定了,如果空間不夠,通常是再創(chuàng)建一個(gè)數(shù)組,然后把舊數(shù)組中的所有引用移到新數(shù)組中.數(shù)組可可以保存基本類型,容器不行.
          容器類不以具體的類型來處理對(duì)象,而是將所有的對(duì)象都以O(shè)bject類型來處理,所以我們可以只創(chuàng)建一個(gè)容器,任意的Java對(duì)象都可以放進(jìn)去.容器類可以使用包裝類(Integer,Double等),以便把基本類型放入其中. List Set Map 都可以自動(dòng)調(diào)整容量,數(shù)組不能.

          Collection表示一組對(duì)象,這些對(duì)象也稱為collection的元素。一些 collection允許有重復(fù)的元素,而另一些則不允許。一些collection是有序的,而另一些則是無序的。JDK中不提供此接口的任何直接實(shí)現(xiàn),它提供更具體的子接口(如 Set 和 List)實(shí)現(xiàn).

          Map 將鍵映射到值的對(duì)象。一個(gè)映射不能包含重復(fù)的鍵;每個(gè)鍵最多只能映射一個(gè)值.Map 接口提供三種collection視圖,允許以鍵集、值集合或鍵值映射關(guān)系集的形式查看某個(gè)映射的內(nèi)容。某些映射實(shí)現(xiàn)可明確保證其順序,如 TreeMap(有序) 類;某些映射實(shí)現(xiàn)則不保證順序,如 HashMap(無序) 類。Map可以像數(shù)組那樣擴(kuò)展成多維數(shù)組,只要把每個(gè)值也做成一個(gè)Map就行了.

          Collection和Map是Java容器中的兩種基本類型. 區(qū)別在于容器中每個(gè)位置保存的元素個(gè)數(shù).Collection每個(gè)位置只能保存一個(gè)元素,包括List和Set.其中List以進(jìn)入的順序保存一組元素; 而Set中的元素不能重復(fù).ArrayList是一種List,HashSet是一種Set,將元素添加入任意Collection都可以使用add() 方法.Map保存的是健值對(duì).使用put()為Map添加元素,它需要一個(gè)健和一個(gè)值作參數(shù).

          ArrayList和LinkedList都實(shí)現(xiàn)了List接口,ArrayList底層由數(shù)組支持LinkedList由雙向鏈表支持,因此,如果經(jīng)常在表中插入或刪除元素LinkedList比較適合,如果經(jīng)常查詢ArrayList比較適合.
          Set的實(shí)現(xiàn)有TreeSet,HashSet,LinkedHashSet,HashSet查詢速度最快,LinkedHashSet保持元素插入次序,TreeSet基于TreeMap,生成一個(gè)總是處于排序狀態(tài)的Set.

                               Collection<--List<--Vector
                                     Collection<--List<--ArrayList
                                     Collection<--List<--LinkedList
                                     Collection<--Set<--HashSet
                                     Collection<--Set<--HashSet<--LinkedHashSet
                                     Collection<--Set<--SortedSet<--TreeSet

          Vector : 基于ArrayList,其實(shí)就是封裝了Array所不具備的一些功能方便我們使用,它不可能走入Array的限制。性能也就不可能超越Array。所以,在可能的情況下,我們要多運(yùn)用Array。另外很重要的一點(diǎn)就是Vector“sychronized”的,這個(gè)也是VectorArrayList的唯一的區(qū)別。

          ArrayList
          :同Vector一樣是一個(gè)基于Array上的鏈表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector優(yōu)越一些,但是當(dāng)運(yùn)行到多線程環(huán)境中時(shí),可需要自己在管理線程的同步問題。

          LinkedList
          LinkedList不同于前面兩種List,它不是基于Array的,所以不受Array性能的限制。它每一個(gè)節(jié)點(diǎn)(Node)都包含兩方面的內(nèi)容:1.節(jié)點(diǎn)本身的數(shù)據(jù)(data);2.下一個(gè)節(jié)點(diǎn)的信息(nextNode)。所以當(dāng)對(duì)LinkedList做添加,刪除動(dòng)作的時(shí)候就不用像基于ArrayList一樣,必須進(jìn)行大量的數(shù)據(jù)移動(dòng)。只要更改nextNode的相關(guān)信息就可以實(shí)現(xiàn)了。這就是LinkedList的優(yōu)勢(shì)。

          List
          總結(jié):

          1.
          所有的List中只能容納單個(gè)不同類型的對(duì)象組成的表,而不是KeyValue鍵值對(duì)。例如:[ tom,1,c ]

          2.
          所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]

          3.
          所有的List中可以有null元素,例如[ tom,null,1 ]

          4.
          基于ArrayListVectorArrayList)適合查詢,而LinkedList(鏈表)適合添加,刪除操作。

          HashSet
          :雖然SetList都實(shí)現(xiàn)了Collection接口,但是他們的實(shí)現(xiàn)方式卻大不一樣。List基本上都是以Array為基礎(chǔ)。但是Set則是在HashMap的基礎(chǔ)上來實(shí)現(xiàn)的,這個(gè)就是SetList的根本區(qū)別。HashSet的存儲(chǔ)方式是把HashMap中的Key作為Set的對(duì)應(yīng)存儲(chǔ)項(xiàng)。看看HashSetaddObject   obj)方法的實(shí)現(xiàn)就可以一目了然了。

               public boolean add(Object obj)
               {
                   return map.put(obj, PRESENT) == null;
               }

          這個(gè)也是為什么在Set中不能像在List中一樣有重復(fù)的項(xiàng)的根本原因,因?yàn)?/span>HashMapkey是不能有重復(fù)的。

          LinkedHashSet
          HashSet的一個(gè)子類,一個(gè)鏈表。

          TreeSet
          SortedSet的子類,它不同于HashSet的根本就是TreeSet是有序的。它是通過SortedMap來實(shí)現(xiàn)的。

          Set
          總結(jié):

          1. Set
          實(shí)現(xiàn)的基礎(chǔ)是MapHashMap);

          2.   Set
          中的元素是不能重復(fù)的,如果使用add(Object obj)方法添加已經(jīng)存在的對(duì)象,則會(huì)覆蓋前面的對(duì)象;


          評(píng)論

          # re: 數(shù)組 Collection List Set Map的比較  回復(fù)  更多評(píng)論   

          2008-08-21 16:10 by sinlff
          CSDN用了很久了, 第1次回貼, 分析的很透徹!!!
          主站蜘蛛池模板: 宁远县| 长顺县| 正阳县| 静宁县| 台东市| 易门县| 长治县| 新绛县| 合水县| 江源县| 英德市| 离岛区| 潍坊市| 桂东县| 大埔县| 两当县| 西贡区| 营山县| 蓬溪县| 溧水县| 金昌市| 清镇市| 弥勒县| 湖口县| 寿阳县| 炉霍县| 永安市| 孟连| 荔浦县| 喀喇沁旗| 武鸣县| 潞城市| 韶山市| 聂荣县| 射阳县| 诸暨市| 随州市| 宁阳县| 韶山市| 黄冈市| 团风县|