最近去面試,發現自己好多基礎知識都一知半解,明明自己腦子裡明白,明白這個知識點的原理,但就是說不出來,也不知道是自己表達能力的問題,還是其實自己對這些知識並沒有掌握,趁每天空閒時間,好好再補下基礎(鬧心,話說有些知識剛學的時候不理解,但是能行記住,用過後理解了,反而記不住了)。(都是看的網上資料,寫的亂,僅作為個人筆記使用)
Java集合類提供了一套設計良好的支持對一組對象進行操作的接口和類。Java集合類裡面最基本的接口有:
1、Collection:代表一組對象,每一個對象都是它的子元素。
2、Set(集):無順序,不包含重復元素的Collection。
3、List(隊列):有順序的collection,並且可以包含重復元素。
4、Map(映射):可以把鍵(key)映射到值(value)的對象,鍵不能重復。
java集合:數據結構,在C語言的中庸struct描述,而在面向對象的編程中,數據結構用類來描述並且包含了有對該數據結構操作的方法。
再java中,設計者對常用的數據結構和算法做了一些規范和實現,這些統稱為 java集合框架。
Collection:最基本的集合接口,一個Collection代表一組Object(對象),一些Collection 允許相同的元素在一起,而又的不行,一些能排序而一些不能排序;
javaSDK不提供直接繼承自Collection的類,提供的類都是繼承自Collection的“子接口”如List和Set;
List接口:list是有順序的Collection,使用此接口能夠精確的控制每個元素插入的位置,用戶能夠使用索引(元素在List中的位置,類似於數組的下標)來訪問List中的元素;List允許有相同的元素存在;
List的實現類:LinkedList.ArrayList,Vector,Stack;
1、LinkList:數據結構是鏈式的線性表(在數據結構筆記中),他實現了List接口,允許NULL存在,此外其提供的get,remove,insert,方法能使LinkedList可被用作棧(stack),隊列(queue),或者雙向隊列(deque);
注意:LinkList沒有同步方法,如果多個線程同時訪問一個List則需要自己實現同步訪問,用同步代碼塊;
2、ArrayList:數據結構是順序的線性表,他實現了可變大小的數組,他允許所有元素,包括NULL,每個ArrayList實例都與一個容量,即存儲元素的數組的大小這個容量可隨著不斷添加新元素而自動增加,但是增長算法並沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率(自動增判斷長度後增長也會浪費時間的呀!)。
同樣:ArrayList沒用同步;
3、Vector::實現了一個大小可變的數組和ArrayList相似,但不同的是,Vector是同步訪問的,其包含的許多傳統方法,這些方法不屬於集合框架,由Vector創建的迭代器正在使用,此時被另一個線程改變了Vector的狀態,會拋異常,必須捕獲;
老的動態數組,效率低,一般不用;由於同步問題,ArrayList 效率 高於Vector;
4、Stack:繼承自Vector,實現了一個先進後出的棧結構,剛創建時是空棧;
Set接口:實際上Set就是Collection,只是行為不同,Set不保存重復的元素(用equals());存入Set的每個元素都是唯一的,不保證元素的順序;
1、TreeSet:實現Set接口,數據結構是紅黑書(自平衡的排序二叉樹,還沒接觸過),是一種Set的變體,可以實現排序等功能的集合,他在添加元素到集合中時,會自動按照某種比較規則將其插入到有序的對象序列中,並保證“升序”排列;
2、HashSet:實現Set接口,其底層是基於HashMap實現的。HashSet底層采用HashMap來保存所有元素,所有放入HashSet中的元素實際上由HashMap的key來保存,而value則存儲了一個靜態的Object的類;