標籤:讀者 檢索 允許 set git eem 郵箱 文章 還需
轉載只供個人學習參考,以下查看請前往原出處:http://www.cnblogs.com/lxl57610/p/5822415.html
在Java中有一套設計優良的介面和類組成了Java集合架構,使程式員操作成批的資料或對象元素極為方便。所有的Java集合都在java.util包中。
在編寫程式的過程中,使用到集合類,要根據不同的需求,來決定使用哪種集合類,比如,要經常遍曆集合內元素,就要使用List,如果要保證集合中不存在重複的資料,就要用Set;如果要通過某一鍵來尋找某一值,就要使用Map。
1)、列表 List介面(繼承於Collection介面)及其實作類別
List介面及其實作類別是容量可變的列表,可按索引訪問集合中的元素。
特點:集合中的元素有序、可重複;
列表在資料結構中分別表現為:數組和向量、鏈表、堆棧、隊列。
實作類別:
ArrayList 實現一個數組,它的規模可變並且能像鏈表一樣被訪問。它提供的功能類似Vector類但不同步,它是以Array方式實現的List,允許快速隨機存取。
LinkedList實現一個鏈表,提供最佳順序存取,適合插入和移除元素。由這個類定義的鏈表也可以像棧或隊列一樣被使用。提供最佳順序存取,適合插入和移除元素。
2)、集 Set介面(繼承於Collection介面)及其實作類別
特點:集合中的元素不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋裡放東西。
對Set中成員的訪問和操作是通過Set中對象的引用進行的,所以集中不能有重複對象。
Set也有多種變體,可以實現排序等功能,如TreeSet,它把對象添加到集中的操作將變為按照某種比較規則將其插入到有序的對象序列中。 它實現的是SortedSet介面,也就是加入了對象比較的方法。通過對集中的對象迭代,我們可以得到一個升序的對象集合。
實作類別:
HashSet 能夠快速定位一個元素,要注意的是:存入HashSet中的對象必須實現HashCode()方法;
TreeSet 將放入其中的元素按序存放。
3)、映射 Map介面及其實作類別
Map是一個單獨的介面,不繼承於Collection。Map是一種把鍵對象和值對象進行關聯的容器。
特點:key不允許重複。
映射與集或列表有明顯區別,映射中每個項都是成對的,Map是把鍵對象和值對象進行關聯的容器。映射中儲存的每個對象都有一個相關的關鍵字(Key)對象,關鍵字決定了對象在映射中的儲存位置,檢索對象時必須提供相應的關鍵字,就像在字典中查單詞一樣。關鍵字應該是唯一的,也就是說Map中的鍵對象不允許重複,這是為了保證查詢結果的一致性。
關鍵字本身並不能決定對象的儲存位置,它需要對過一種散列(hashing)技術來處理,產生一個被稱作散列碼(hash code)的整數值,散列碼通常用作一個偏置量,該偏置量是相對於分配給映射的記憶體地區起始位置的,由此確定關鍵字/對象對的儲存位置。理想情況下,散列處理應該產生給定範圍內均勻分布的值,而且每個關鍵字應得到不同的散列碼。
實作類別:
HashMap 實現一個鍵到值對應的雜湊表,通過鍵取得值對象,沒有順序,通過get(key)來擷取value,允許儲存Null 物件,而且允許鍵是空(由於鍵必須是唯一的,當然只能有一個);
HashTable 實現一個映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實現hashcode()方法和equal()方法。這個類是前面java實現的一個繼承,並且通常能在實現映象的其他類中更好的使用。
當元素的順序很重要時選用TreeMap,當元素不必以特定的順序進行儲存時,使用HashMap。Hashtable的使用不被推薦,因為HashMap提供了所有類似的功能,並且速度更快。當你需要在多線程環境下使用時,HashMap也可以轉換為同步的。
Properties 一般是把屬性檔案讀入流中後,以鍵-值對的形式進行儲存,以方便讀取其中的資料。
4)、Iterator介面
Iterator介面位於java.util包中,它是一個對集合進行迭代的迭代器。
集合容器(如:List、Set、Map等)本身提供了處理元素置入和取出的方式,但是單一選取元素的方法很受限制。所以我們要用Iterator去選取容器中的元素,它將容器轉換成一個序列。
Iterator iter=Object.iterator();
while(iter.hasNext()){ }
以下是筆者總結的一些面試中經常會問的相關問題:
1.Collection、Set和List的區別?
Collection對象之間沒有指定的順序,允許有重複元素和多個null元素對象;它是Set和List介面的父類,是一種最通用型的集合介面;
Set各個元素對象之間沒有指定的順序,不允許有重複元素,最多允許有一個null元素對象;
List各個元素對象之間有指定的順序,允許重複元素和多個null元素對象;
2.LinkedList,ArrayList,Vector,Stack,Queue區別?NodeList區別?
1)LinkedList鏈式訪問,以指標相連,適合於在鏈表中間需要頻繁進行插入和刪除操作。
2)ArrayList類似數組的形式,按照序號儲存,隨機訪問速度非常快。
3)Vector向量按照各元素序號儲存,數組大小可以動態增長,對於大容量資料存放區效率較高。
4)Stack堆棧,先進後出的數組。
這些類的對比與選擇:
如果涉及到堆棧隊列等操作,應該考慮List中的stack,queue
對於需要快速插入刪除元素,應該使用linkedlist
如果需要快速隨機訪問元素,應該選用arraylist
如果程式在單線程環境中,選用非同步類
如果在多線程中,選用同步類vector、stack和hashtable以及其子類。
幾個面試常見問題:
ArrayList和Vector有什麼區別?HashMap和HashTable有什麼區別?
Vector和HashTable是線程同步的(synchronized)。效能上,ArrayList和HashMap分別比Vector和Hashtable要好。
講解java集合的體繫結構
A:List、Set、Map是這個集合體系中最主要的三個介面。
其中List和Set繼承自Collection介面。
Set不允許元素重複。HashSet和TreeSet是兩個主要的實作類別。
List有序且允許元素重複。ArrayList、LinkedList和Vector是三個主要的實作類別。
Map也屬於集合系統,但和Collection介面不同。Map是key對value的映射集合,其中key列就是一個集合。key不能重複,但是value可以重複。HashMap、TreeMap和Hashtable是三個主要的實作類別。
SortedSet和SortedMap介面對元素按指定規則排序,SortedMap是對key列進行排序
Comparable和Comparator區別
A:調用java.util.Collections.sort(List list)方法來進行排序的時候,List內的Object都必須實現了Comparable介面。
java.util.Collections.sort(List list,Comparator c),可以臨時聲明一個Comparator 來實現排序。 Collections.sort(imageList, new Comparator() { public int compare(Object a, Object b) { int orderA = Integer.parseInt( ( (Image) a).getSequence()); int orderB = Integer.parseInt( ( (Image) b).getSequence()); return orderA - orderB; } });
如果需要改變排列順序
改成return orderb - orderA 即可。
簡述equals()和hashCode()
heap和stack有什麼區別
1.heap是堆,stack是棧。
2.stack的空間由作業系統自動分配和釋放,heap的空間是手動申請和釋放的,heap常用new關鍵字來分配。
3.stack空間有限,heap的空間是很大的自由區。
若只是聲明一個對象,則先在棧記憶體中為其分配地址空間,
若再new一下,執行個體化它,則在堆記憶體中為其分配地址。
接下來看看什麼是NodeList,NodeList跟arguments都不是普通的數組,他們有數組的一些基本屬性但是又不完全是數組。由字面意思來看 NodeList是DOM操作(getElementsByTagName等)取出來的集合,是集合而不是普通的數組,但是他們有數組的一些屬性,例如length、下標索 引,但是他們也有自己的屬性,例如item,另外NodeList最大的特點就是時效性(live)。關於NodeList網上相關的資源不是很多,如果有讀者對這 塊內容比較熟悉,歡迎評論或發我郵箱[email protected]。
3.HashMap,HashTable,TreeMap,WeakHashMap的區別?ConcurrentHashMap區別?
關於HashMap,HashTable,TreeMap,上面已經說的非常詳細了;
WeakHashMap是一種改進的hashmap,他對key進行弱引用,如果一個key不再被外部參考,則被gc回收; 有興趣深入理解WeakHashMap的朋友可以查看這個帖ttp://mikewang.blog.51cto.com/3826268/880775;
ConcurrentHashMap是Java 5中支援高並發、高輸送量的安全執行緒HashMap實現。允許多個修改操作並發進行,其關鍵在於使用了鎖分離技術。 有興趣升入理解ConcurrentHashMap的朋友可以查看這個貼http://www.iteye.com/topic/344876。
補充:
LinkedeList和ArrayList都實現了List介面,但是它們的工作原理卻不一樣。它們之間最主要的區別在於ArrayList是可改變大小的數組,而LinkedList是雙向連結串列(doubly LinkedList)。ArrayList更受歡迎,很多情境下ArrayList比LinkedList更為適用。這篇文章中我們將會看看LinkedeList和ArrayList的不同,而且我們試圖來看看什麼情境下更適宜使用LinkedList,而不用ArrayList。
LinkedList和ArrayList的區別
LinkedList和ArrayList的差別主要來自於Array和LinkedList資料結構的不同。如果你很熟悉Array和LinkedList,你很容易得出下面的結論:
1) 因為Array是基於索引(index)的資料結構,它使用索引在數組中搜尋和讀取資料是很快的。Array擷取資料的時間複雜度是O(1),但是要刪除資料卻是開銷很大的,因為這需要重排數組中的所有資料。
2) 相對於ArrayList,LinkedList插入是更快的。因為LinkedList不像ArrayList一樣,不需要改變數組的大小,也不需要在數組裝滿的時候要將所有的資料重新裝入一個新的數組,這是ArrayList最壞的一種情況,時間複雜度是O(n),而LinkedList中插入或刪除的時間複雜度僅為O(1)。ArrayList在插入資料時還需要更新索引(除了插入數組的尾部)。
3) 類似於插入資料,刪除資料時,LinkedList也優於ArrayList。
4) LinkedList需要更多的記憶體,因為ArrayList的每個索引的位置是實際的資料,而LinkedList中的每個節點中儲存的是實際的資料和前後節點的位置。
什麼情境下更適宜使用LinkedList,而不用ArrayList
我前面已經提到,很多情境下ArrayList更受歡迎,但是還有些情況下LinkedList更為合適。譬如:
1) 你的應用不會隨機訪問資料。因為如果你需要LinkedList中的第n個元素的時候,你需要從第一個元素順序數到第n個資料,然後讀取資料。
2) 你的應用更多的插入和刪除元素,更少的讀取資料。因為插入和刪除元素不涉及重排資料,所以它要比ArrayList要快。
以上就是關於ArrayList和LinkedList的差別。你需要一個不同步的基於索引的資料訪問時,請盡量使用ArrayList。ArrayList很快,也很容易使用。但是要記得要給定一個合適的初始大小,儘可能的減少更改數組的大小。
Java集合類