1. 程式人生 > >java集合類,List和Set比較,各自的子類比較(ArrayList,Vector,LinkedList;HashSet,TreeSet),Map集合比較

java集合類,List和Set比較,各自的子類比較(ArrayList,Vector,LinkedList;HashSet,TreeSet),Map集合比較

ArrayListLinkedListVector都屬於List

List:元素是有順序的,元素可以重複因為每個元素有自己的角標(索引)

|-- ArrayList:底層是陣列結構,特點是:查詢很快,增稍微慢點,執行緒不同步:A執行緒將元素放在索引0位置,CPU排程執行緒A停止,B執行,也將元素放在索引0位置,當AB同時執行的時候Size就程式設計了2.

|-- LinkedList:底層使用的是連結串列資料結構,特點是:增刪很快,查詢慢。執行緒不安全,執行緒安全問題是由多個執行緒同時寫或同時讀寫同一個資源造成的。

|--Vector:底層是陣列資料結構,執行緒同步,Vector的方法前面加了synchronized

關鍵字,被ArrayList代替了,現在用的只有他的列舉。

Set:元素是無序的,且不可以重複(存入和取出的順序不一定一致),執行緒不同步。set底層是使用Map實現的,故可以通過ConcurrentHashMap的方式變通實現執行緒安全的Set

|--HashSet:底層是雜湊表資料結構。根據hashCodeequals方法來確定元素的唯一性。

hashCodeequals:作用一樣,都是用來比較兩個物件是否相等一致。

equals比較的比較全面,而利用hashCode()進行對比,則只要生成一個hash值進行比較久可以了,效率高。

equal()相等的兩個物件他們的hashCode()肯定相等,也就是

equal()是絕對可靠的。

hashCode()相等的兩個物件他們的equal()不一定相等,hashCode()不是絕對可靠的。

當兩個物件需要對比的時候,首先用hashCode()去對比,如果不一樣,則表示這兩個物件肯定不相等(也就不用再比較equal(0)了),如果hashCode()相同,再比較equal(),如果equal()相同,那兩個物件就是相同的。

|--TreeSet:可以對Set集合中的元素進行排序(自然循序),底層的資料結構是二叉樹,

也可以自己寫個類實現Comparable 或者 Comparator 介面,定義自己的比較器,將其作為引數傳遞給TreeSet的建構函式。

Comparable

:可以認為是一個內比較器(public int compareTo(Domain domain){ if(this.str.compareTo(domain.str) > 0) }),實現了Comparable介面的類有一個特點,就是這些類是可以和自己比較的,用ComparableTo(自然比較方法)方法進行比較,返回值是int,比較者和被比較者:大於返回正數,小於返回負數,相等返回0.this.str和引數類.str比較)

Comparator:外比較器,方法有兩個引數o1o2,返回值是int. 1o1大於o2,返回正整數

2o1等於o2,返回0.3o1小於o3,返回負整數

兩者比較:實現ComparableComparator介面耦合性強,Comparator是在類外部進行比較的。可以自己定義比較器,寫比較演算法,不需要對實現類進行任何修改。實際上實現Comparator 介面的方式後面會寫到就是一種典型的策略模式。

策略模式和工廠模式相同點:通過多型減少程式碼的耦合度,都是通過多型來實現不同子類的選取。

簡單工廠模式:只需要傳遞相應的條件就能得到想要的一個物件,然後通過這個物件實現演算法的操作。實現了選取一個類去例項化物件。

策略模式:使用時必須首先建立一個想使用的類物件,然後將該物件作為引數傳遞進去,通過該物件呼叫不同的演算法。選取相應物件的工作交給模式的使用者,本身不做選取工作。

其實兩個的差別很微妙,Factory是直接建立具體的物件並用該物件去執行相應的動作,而Context將這個操作給了Context類,沒有建立具體的物件,實現的程式碼的進一步封裝,客戶端程式碼並不需要知道具體的實現過程。

Map:這個集合是儲存鍵值對的,一對一對往裡存,而且要確保鍵的唯一性(01,張三)這樣的形式打印出來就是01=張三

|--HashTable:底層是雜湊表資料結構,不可以存入null鍵和null值,該集合執行緒是同步的,效率比較低。出現於JDK1.0。執行緒安全,使用synchronized鎖住整張Hash表實現執行緒安全,即每次鎖住整張表讓執行緒獨佔。

|--HashMap:底層是雜湊表資料結構,可以存入null鍵和null值,執行緒不同步,效率較高,代替了HashTable,出現於JDK 1.2

|--TreeMap:底層是二叉樹資料結構,執行緒不同步,可以用於對map集合中的鍵進行排序

ConcurrentHashMap:執行緒安全,允許多個修改操作併發進行,其關鍵在於使用了鎖分離技術,它使用了多個鎖來控制對hash表的不同部分進行的修改。ConcurrentHashMap內部使用段(Segment)來表示這些不同的部分,每個段其實就是一個小的Hashtable,它們有自己的鎖。只要多個修改操作發生在不同的段上,它們就可以併發進行。