Java集合框架(List,Set,Map)


單列集合基本框架


List接口特點:
1. 它是一個元素存取有序的集合。例如,存元素的順序是11、22、33。那么集合中,元素的存儲就是按照11、22、33的順序完成的)。

2. 它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素(與數組的索引是一個道理)。

3. 集合中可以有重復的元素,通過元素的equals方法,來比較是否為重復的元素。

4.List 接口提供了特殊的迭代器,稱為 ListIterator,除了允許 Iterator 接口提供的正常操作外,該迭代器還允許元素插入和替換,以及雙向訪問。還提供了一個方法來獲取從列表中指定位置開始的列表迭代器。

List接口常用實現類:

## vector集合
Vector 類可以實現可增長的對象數組。與數組一樣,它包含可以使用整數索引進行訪問的組件。

由 Vector 的 iterator 和 listIterator 方法所返回的迭代器是快速失敗的

特點:1.線程同步的2.底層是數組實現的

特有方法

Enumeration<E> elements()  

##ArrayList集合
1.底層是數組實現的
2.不是線程同步的
3.查詢比較快
java.util.ArrayList`集合數據存儲的結構是數組結構。方便元素隨機訪問。

## LinkedList集合
1.底層是一個鏈表實現的
2.不同步。線程不安全
3.增刪是比較快的,原因在底層.
LinkedList`集合數據存儲的結構是鏈表結構。方便元素添加、刪除的集合

##區別

Vector & ArrayList

1)Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的

方法不是,由於線程的同步必然要影響性能,因此,ArrayList的性能比Vector好。

2)當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,

而ArrayList只增加50%的大小,這樣,ArrayList就有利於節約內存空間。

ArrayList & LinkedList

ArrayList的內部實現是基於內部數組Object[],所以從概念上講,它更象數組,

但LinkedList的內部實現是基於一組連接的記錄,所以,它更象一個鏈表結構,所以,它們在性能上有很大的差別:

 

## Enumeration和Iterator接口的區別

Iterator替代了Enumeration,Enumeration是一個舊的迭代器了。

與Enumeration相比,Iterator更加安全,因為當一個集合正在被遍歷的時候,它會阻止其它線程去修改集合。

區別有三點:

Iterator的方法名比Enumeration更科學

Iterator有fail-fast機制,比Enumeration更安全

Iterator能夠刪除元素,Enumeration並不能刪除元素

 

## ListIterator有什么特點
ListIterator繼承了Iterator接口,它用於遍歷List集合的元素。

ListIterator可以實現雙向遍歷,添加元素,設置元素

 Set接口特點:

1.存取無序

2.沒有索引,不能通過普通for循環遍歷

3.不允許元素重復

Set接口常用實現類

##TreeSet集合

底層:紅黑樹,可以實現元素的自然排序和定制排序
解析:treeSet底層是用TreeMap實現的,構造方法中會創建一個TreeMap的實例,用於存放元素。添加元素時,需要先判斷當前有無比較器,如果有,則根據比較器的比較規則進行排序,如果沒有,則根據元素本身的特性進行排序。

##HashSet集合

底層:哈希表
解析:hashSet實現了Set接口,底層采用的是hash表,實際上采用的是一個HashMap的實例,在HashSet中,所有的元素都是存儲到HashMap鍵值對的key上面,而value有一個統一的值。  

hashSet不存入相同的元素是因為,重寫了hashCode()和equals()

##LinkedHashSet

LinkedHashSet內部使用的是LinkHashMap。這樣做的意義或者好處就是LinkedHashSet中的元素順序是可以保證的,也就是說遍歷序和插入序是一致的。

## HashSet與TreeSet的區別

HashSet 【線程不安全,存取速度快,底層是hash實現】
TreeSet 【紅黑樹數據結構,默認對元素自然排序】

Map接口

Map是Java.util包中的另一個接口,它和Collection接口沒有關系,是相互獨立的,但是都屬於集合類的一部分。Map包含了key-value對。Map不能包含重復的key,但是可以包含相同的value。

Map接口常用實現類:

##HashMap:

數組方式存儲key/value,線程非安全允許null作為key和value,key不可以重復,value允許重復,不保證元素迭代順序是按照插入時的順序,key的hash值是先計算key的hashcode值,然后再進行計算,每次容量擴容會重新計算所以key的hash值,會消耗資源,要求key必須重寫equals和hashcode方法

  默認初始容量16,加載因子0.75,擴容為舊容量乘2,查找元素快,如果key一樣則比較value,如果value不一樣,則按照鏈表結構存儲value,就是一個key后面有多個value;

##Hashtable

  Hashtable與HashMap類似,是HashMap的線程安全版,它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了Hashtale在寫入時會比較慢,它繼承自Dictionary類,不同的是它不允許記錄的鍵或者值為null,同時效率較低,

特有方法

Enumeration<E> elements()  

##LinkedHashMap

LinkedHashMap保存了記錄的插入順序,在用Iteraor遍歷LinkedHashMap時,先得到的記錄肯定是先插入的,在遍歷的時候會比HashMap慢,有HashMap的全部特性。

##TreeMap

  基於紅黑二叉樹的NavigableMap的實現,線程非安全,key不允許null,key不可以重復,value允許重復,存入TreeMap的元素應當實現Comparable接口或者實現Comparator接口,會按照排序后的順序迭代元素,兩個相比較的key不得拋出classCastException。主要用於存入元素的時候對元素進行自動排序,迭代輸出的時候就按排序順序輸出

##HashMap&##Hashtable的區別

是否允許為null:

HashMap允許為null

Hashtable不允許為null

contains方法

Hashtable有contains方法

HashMap把Hashtable的contains方法去掉了,改成了containsValue和containsKey

繼承不同:

HashMap<K,V> extends AbstractMap<K,V>

public class Hashtable<K,V> extends Dictionary<K,V>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM