我們的生活越來越精彩
          學(xué)無止境,恒心,毅力,堅(jiān)持
          posts - 20,  comments - 6,  trackbacks - 0

          1.Collection List Set Map 區(qū)別記憶

          這些都代表了Java中的集合,這里主要從其元素是否有序,是否可重復(fù)來進(jìn)行區(qū)別記憶,以便恰當(dāng)?shù)厥褂茫?dāng)然還存在同步方面的差異,見上一篇相關(guān)文章。

          有序否

          允許元素重復(fù)否

          Collection

          List

          Set

          AbstractSet

          HashSet

          TreeSet

          是(用二叉樹排序)

          Map

          AbstractMap

          使用key-value來映射和存儲(chǔ)數(shù)據(jù),Key必須惟一,value可以重復(fù)

          HashMap

          TreeMap

          是(用二叉樹排序)

          List 接口對Collection進(jìn)行了簡單的擴(kuò)充,它的具體實(shí)現(xiàn)類常用的有ArrayList和LinkedList。你可以將任何東西放到一個(gè)List容器 中,并在需要時(shí)從中取出。ArrayList從其命名中可以看出它是一種類似數(shù)組的形式進(jìn)行存儲(chǔ),因此它的隨機(jī)訪問速度極快,而LinkedList的內(nèi) 部實(shí)現(xiàn)是鏈表,它適合于在鏈表中間需要頻繁進(jìn)行插入和刪除操作。在具體應(yīng)用時(shí)可以根據(jù)需要自由選擇。前面說的Iterator只能對容器進(jìn)行向前遍歷,而 ListIterator則繼承了Iterator的思想,并提供了對List進(jìn)行雙向遍歷的方法。

          Set接口也是 Collection的一種擴(kuò)展,而與List不同的時(shí),在Set中的對象元素不能重復(fù),也就是說你不能把同樣的東西兩次放入同一個(gè)Set容器中。它的常 用具體實(shí)現(xiàn)有HashSet和TreeSet類。HashSet能快速定位一個(gè)元素,但是你放到HashSet中的對象需要實(shí)現(xiàn)hashCode()方 法,它使用了前面說過的哈希碼的算法。而TreeSet則將放入其中的元素按序存放,這就要求你放入其中的對象是可排序的,這就用到了集合框架提供的另外 兩個(gè)實(shí)用類Comparable和Comparator。一個(gè)類是可排序的,它就應(yīng)該實(shí)現(xiàn)Comparable接口。有時(shí)多個(gè)類具有相同的排序算法,那就 不需要在每分別重復(fù)定義相同的排序算法,只要實(shí)現(xiàn)Comparator接口即可。集合框架中還有兩個(gè)很實(shí)用的公用類:Collections和 Arrays。Collections提供了對一個(gè)Collection容器進(jìn)行諸如排序、復(fù)制、查找和填充等一些非常有用的方法,Arrays則是對一 個(gè)數(shù)組進(jìn)行類似的操作。


          Map是一種把鍵對象和值對象進(jìn)行關(guān)聯(lián)的容器,而一個(gè)值對象又可以是一個(gè)Map,依次類推,這樣就可 形成一個(gè)多級(jí)映射。對于鍵對象來說,像Set一樣,一個(gè)Map容器中的鍵對象不允許重復(fù),這是為了保持查找結(jié)果的一致性;如果有兩個(gè)鍵對象一樣,那你想得 到那個(gè)鍵對象所對應(yīng)的值對象時(shí)就有問題了,可能你得到的并不是你想的那個(gè)值對象,結(jié)果會(huì)造成混亂,所以鍵的唯一性很重要,也是符合集合的性質(zhì)的。當(dāng)然在使 用過程中,某個(gè)鍵所對應(yīng)的值對象可能會(huì)發(fā)生變化,這時(shí)會(huì)按照最后一次修改的值對象與鍵對應(yīng)。對于值對象則沒有唯一性的要求。你可以將任意多個(gè)鍵都映射到一 個(gè)值對象上,這不會(huì)發(fā)生任何問題(不過對你的使用卻可能會(huì)造成不便,你不知道你得到的到底是那一個(gè)鍵所對應(yīng)的值對象)。Map有兩種比較常用的實(shí)現(xiàn): HashMap和TreeMap。HashMap也用到了哈希碼的算法,以便快速查找一個(gè)鍵,TreeMap則是對鍵按序存放,因此它便有一些擴(kuò)展的方 法,比如firstKey(),lastKey()等,你還可以從TreeMap中指定一個(gè)范圍以取得其子Map。鍵和值的關(guān)聯(lián)很簡單,用pub (Object key,Object value)方法即可將一個(gè)鍵與一個(gè)值對象相關(guān)聯(lián)。用get(Object key)可得到與此key對象所對應(yīng)的值對象。

          2.List、vector、set、map的區(qū)別與聯(lián)系

          在使用Java的時(shí)候,我們都會(huì)遇到使用集合(Collection)的時(shí)候,但是Java API提供了多種集合的實(shí)現(xiàn),我在使用和面試的時(shí)候頻頻遇到這樣的抉擇 :)(主要還是面試的時(shí)候)
          久而久之,也就有了一點(diǎn)點(diǎn)的心得體會(huì),寫出來以供大家討論
          總的說來,Java API中所用的集合類,都是實(shí)現(xiàn)了Collection接口,他的一個(gè)類繼承結(jié)構(gòu)如下:

          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)對LinkedList做添加,刪除動(dòng)作的時(shí)候就不用像基于ArrayList一樣,必須進(jìn)行大量的數(shù)據(jù)移動(dòng)。只要更改nextNode的相關(guān)信息就可以實(shí)現(xiàn)了。這就是LinkedList的優(yōu)勢。

          List
          總結(jié):

          1.
          所有的List中只能容納單個(gè)不同類型的對象組成的表,而不是KeyValue鍵值對。例如:[ 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的對應(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)存在的對象,則會(huì)覆蓋前面的對象;
          3.Java基本概念:集合類 List/Set/Map... 的區(qū)別和聯(lián)系

          Collection:List、Set
          Map:HashMap、HashTable

          如何在它們之間選擇


          一、Array , Arrays

          Java所有“存儲(chǔ)及隨機(jī)訪問一連串對象”的做法,array是最有效率的一種。

          1、
          效率高,但容量固定且無法動(dòng)態(tài)改變。
          array還有一個(gè)缺點(diǎn)是,無法判斷其中實(shí)際存有多少元素,length只是告訴我們array的容量。

          2、Java中有一個(gè)Arrays類,專門用來操作array
          arrays中擁有一組static函數(shù),
          equals():比較兩個(gè)array是否相等。array擁有相同元素個(gè)數(shù),且所有對應(yīng)元素兩兩相等。
          fill():將值填入array中。
          sort():用來對array進(jìn)行排序。
          binarySearch():在排好序的array中尋找元素。
          System.arraycopy():array的復(fù)制。


          二、Collection , Map

          若撰寫程序時(shí)不知道究竟需要多少對象,需要在空間不足時(shí)自動(dòng)擴(kuò)增容量,則需要使用容器類庫,array不適用。

          1、Collection 和 Map 的區(qū)別

          容器內(nèi)每個(gè)為之所存儲(chǔ)的元素個(gè)數(shù)不同。
          Collection類型者,每個(gè)位置只有一個(gè)元素。
          Map類型者,持有 key-value pair,像個(gè)小型數(shù)據(jù)庫。

          2、各自旗下的子類關(guān)系

          Collection --List: 將以特定次序存儲(chǔ)元素。所以取出來的順序可能和放入順序不同。
          --ArrayList / LinkedList / Vector --Set : 不能含有重復(fù)的元素
          --HashSet / TreeSet
          Map
          --
          HashMap
          --HashTable
          --TreeMap

          3、其他特征

          * List,Set,Map將持有對象一律視為Object型別。
          * Collection、List、Set、Map都是接口,不能實(shí)例化。
          繼承自它們的 ArrayList, Vector, HashTable, HashMap是具象class,這些才可被實(shí)例化。
          * vector容器確切知道它所持有的對象隸屬什么型別。vector不進(jìn)行邊界檢查。


          三、Collections

          Collections是針對集合類的一個(gè)幫助類。提供了一系列靜態(tài)方法實(shí)現(xiàn)對各種集合的搜索、排序、線程完全化等操作。
          相當(dāng)于對Array進(jìn)行類似操作的類——Arrays。
          如,Collections.max(Collection coll); 取coll中最大的元素。
          Collections.sort(List list); 對list中元素排序

          四、如何選擇?

          1、容器類和Array的區(qū)別、擇取
          * 容器類僅能持有對象引用(指向?qū)ο蟮闹羔槪皇菍ο笮畔opy一份至數(shù)列某位置。
          * 一旦將對象置入容器內(nèi),便損失了該對象的型別信息。

          2、
          * 在各種Lists中,最好的做法是以ArrayList作為缺省選擇。當(dāng)插入、刪除頻繁時(shí),使用LinkedList();
          Vector總是比ArrayList慢,所以要盡量避免使用。
          * 在各種Sets中,HashSet通常優(yōu)于HashTree(插入、查找)。只有當(dāng)需要產(chǎn)生一個(gè)經(jīng)過排序的序列,才用TreeSet。
          HashTree存在的唯一理由:能夠維護(hù)其內(nèi)元素的排序狀態(tài)。
          * 在各種Maps中
          HashMap用于快速查找。
          * 當(dāng)元素個(gè)數(shù)固定,用Array,因?yàn)锳rray效率是最高的。

          結(jié)論:最常用的是ArrayList,HashSet,HashMap,Array。


          注意:

          1、Collection沒有g(shù)et()方法來取得某個(gè)元素。只能通過iterator()遍歷元素。
          2、Set和Collection擁有一模一樣的接口。
          3、List可以通過get()方法來一次取出一個(gè)元素。使用數(shù)字來選擇一堆對象中的一個(gè),get(0)...。(add/get)
          4、一般使用ArrayList。用LinkedList構(gòu)造堆棧stack、隊(duì)列queue

          5、Map用 put(k,v) / get(k),還可以使用containsKey()/containsValue()來檢查其中是否含有某個(gè)key/value。
          HashMap會(huì)利用對象的hashCode來快速找到key。
          * hashing 哈希碼就是將對象的信息經(jīng)過一些轉(zhuǎn)變形成一個(gè)獨(dú)一無二的int值,這個(gè)值存儲(chǔ)在一個(gè)array中。
          我們都知道所有存儲(chǔ)結(jié)構(gòu)中,array查找速度是最快的。所以,可以加速查找。

          發(fā)生碰撞時(shí),讓array指向多個(gè)values。即,數(shù)組每個(gè)位置上又生成一個(gè)梿表。

          6、Map中元素,可以將key序列、value序列單獨(dú)抽取出來。使用keySet()抽取key序列,將map中的所有keys生成一個(gè)Set。
          使用values()抽取value序列,將map中的所有values生成一個(gè)Collection。

          為什么一個(gè)生成Set,一個(gè)生成Collection?那是因?yàn)椋琸ey總是獨(dú)一無二的,value允許重復(fù)。

          posted on 2008-04-08 13:34 鳥生魚湯 閱讀(249) 評(píng)論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          <2008年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章檔案

          喜歡的技術(shù)博客

          喜歡的有意思有味道的博客 放松并鼓勵(lì)自己

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 大关县| 广安市| 龙游县| 忻城县| 金山区| 旬阳县| 鸡东县| 海晏县| 奈曼旗| 厦门市| 新宁县| 喜德县| 富川| 介休市| 浑源县| 阿拉善左旗| 临江市| 同江市| 黔西| 吉首市| 宁德市| 辽源市| 子洲县| 松阳县| 察隅县| 米易县| 当涂县| 祥云县| 夏邑县| 富锦市| 商南县| 调兵山市| 师宗县| 阿拉善右旗| 和平县| 区。| 无锡市| 东阿县| 扶绥县| 泸西县| 彝良县|