當前位置:編程學習大全網 - 編程語言 - Java中List、Set、Map接口之間的區別和聯系

Java中List、Set、Map接口之間的區別和聯系

List 用於遍歷壹個數組時效率最高;比如在循環顯示所有信息時經常用到;

Set中的元素是不能重復的,如果使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象;雖然Set同List都實現了Collection接口,但是他們的實現方式卻大不壹樣。List基本上都是以Array為基礎。但是Set則是在HashMap的基礎上來實現的,這個就是Set和List的根本區別。 Map 就是鍵值對map(鍵,值),鍵是Sting 類型 值是Object (對象類型),所以在知道某條信息的壹項時查詢其他項就用該方法,效率最高!(以上個人見解!)

詳細:數組和其它容器的區別主要有三方面:效率,類型,和保存基本類型的能力.在Java中,數組是壹種效率很高的存儲和隨機訪問對象引用序列的方式.數組是壹 個簡單的線性序列,因此訪問速度很快,但也損失了其它壹些特性.創建壹個數組對象後,大小就固定了,如果空間不夠,通常是再創建壹個數組,然後把舊數組中 的所有引用移到新數組中.數組可可以保存基本類型,容器不行.

容器類不以具體的類型來處理對象,而是將所有的對象都以Object類型來處理,所以我們可以只創建壹個容器,任意的Java對象都可以放進去.容器類可 以使用包裝類(Integer,Double等),以便把基本類型放入其中. List Set Map 都可以自動調整容量,數組不能.

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

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

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

ArrayList和LinkedList都實現了List接口,ArrayList底層由數組支持LinkedList由雙向鏈表支持,因此,如果經常在表中插入或刪除元素LinkedList比較適合,如果經常查詢ArrayList比較適合.

Set的實現有TreeSet,HashSet,LinkedHashSet,HashSet查詢速度最快,LinkedHashSet保持元素插入次序,TreeSet基於TreeMap,生成壹個總是處於排序狀態的Set.

Collection<--List<--Vector

Collection<--List<--ArrayList

Collection<--List<--LinkedList

Collection<--Set<--HashSet

Collection<--Set<--HashSet<--LinkedHashSet

Collection<--Set<--SortedSet<--TreeSet

Vector : 基於Array的List,其實就是封裝了Array所不具備的壹些功能方便我們使用,它不可能走入Array的限制。性能也就不可能超越Array。所以,在可能的情況下,我們要多運用Array。另外很重要的壹點就是Vector“sychronized”的,這個也是Vector和ArrayList的唯壹的區別。

ArrayList:同Vector壹樣是壹個基於Array上的鏈表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector優越壹些,但是當運行到多線程環境中時,可需要自己在管理線程的同步問題。

LinkedList:LinkedList不同於前面兩種List,它不是基於Array的,所以不受Array性能的限制。它每壹個節點(Node)都包含兩方面的內容:1.節點本身的數據(data);2.下壹個節點的信息(nextNode)。所以當對LinkedList做添加,刪除動作的時候就不用像基於Array的List壹樣,必須進行大量的數據移動。只要更改nextNode的相關信息就可以實現了。這就是LinkedList的優勢。

List總結:

1. 所有的List中只能容納單個不同類型的對象組成的表,而不是Key-Value鍵值對。例如:[ tom,1,c ];

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

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

4. 基於Array的List(Vector,ArrayList)適合查詢,而LinkedList(鏈表)適合添加,刪除操作。

HashSet:雖然Set同List都實現了Collection接口,但是他們的實現方式卻大不壹樣。List基本上都是以Array為基礎。但是Set則是在HashMap的基礎上來實現的,這個就是Set和List的根本區別。HashSet的存儲方式是把HashMap中的Key作為Set的對應存儲項。看看HashSet的add(Object obj)方法的實現就可以壹目了然了。

public boolean add(Object obj)

{

return map.put(obj, PRESENT) == null;

}

這個也是為什麽在Set中不能像在List中壹樣有重復的項的根本原因,因為HashMap的key是不能有重復的。

LinkedHashSet:HashSet的壹個子類,壹個鏈表。

TreeSet:SortedSet的子類,它不同於HashSet的根本就是TreeSet是有序的。它是通過SortedMap來實現的。

Set總結:

1. Set實現的基礎是Map(HashMap);

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

/530536333/blog/1283866146

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

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

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

  • 上一篇:榆次逸夫小學的課改科研
  • 下一篇:行政剛入職自我介紹
  • copyright 2024編程學習大全網