單列集合基本框架
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>