體系結構:? 集合主要分為兩種,單列集合collection和雙列集合Map,區別在于單列集合一次插入一條數據,而雙列的一次插入類似于key-value的形式
單列集合collection
注:紅色的表示是接口,藍色的是實現類
①操作功能:
增加: add(),List的新增一定是成功的,而Set不一定因為其有不能重復的限制條件
清空:clear()
刪除:remove(),因為collection中定義的是共性的方法,所以刪除不能通過索引去刪除
判斷是否存在:contains(),其底層是通過equals()方法實現的,因為equals()方法是基于比較地址值,所以如果集合中存的是對象的話,要重寫equals()方法才能進行contains的比較
判斷是否為空:isEmpty()
返回集合大小:size()
②遍歷方式:
集合的遍歷方式有三種,分別是迭代器遍歷,增強for遍歷和lambda表達式遍歷
迭代器(Iterator)遍歷:創建Iterator對象進行遍歷
注:? ?迭代完畢指針不會復位;循環中next()只能用一次;迭代過程中不允許使用集合的方法增加刪除
增強for遍歷:底層其實就是迭代器? ?
注:? ?集合名.for快速生成;對s中的修改不對集合的原數據有影響
Lambda表達式(foreach)遍歷:底層就是遍歷集合通過accept方法依次過的元素
③List
?注:? remove的時候如果有方法重載了,優先調用形參和實參類型一樣的方法。remove(1)是索引
遍歷方式:? 相比于collection的3種遍歷方式,List當然全部繼承了,但是因為List有了索引的機制,所以List還增加了兩種,普通的for循環和列表迭代器(listIterator)
數據結構:
?ArrayList詳解:底層是數組
?源碼:
①創建ArrayList時是一個長度為0的elementData
②在插入第一個元素時,將擴容為長度為10的數組,然后把數據放進去
?①當原數組的長度已經用完了,底層就要去擴容,默認是擴容原數組長度的一半,即1.5倍
②如果插入的數據長度很大,就會擴容到大長度的地方
LinkedList詳解:底層是雙向鏈表
?注: 這里的方法基本不用,而是基本使用List的方法
源碼:學了數據結構中的雙向鏈表就可以清楚的知道其操作流程
④Set
泛型:?
泛型的作用:?
?java中的泛型其實是偽泛型:即其實底層存的時候依然是object對象,泛型會擦除
泛型可以定義在類上,也可以定義在方法上,還可以定義在接口上?
HashSet詳解:? 底層是哈希表,jdk8之前是數組+鏈表,jdk8之后是數組+鏈表+紅黑樹
?存數據的過程:①由hashcode計算出應存入的位置②如果位置是空就放進去③如果不為空,則調用equals方法去判斷是否一樣的,如果一樣的就不存④如果不一樣的話,jdk8之前是把新元素放進去,老元素取出來掛在新元素后面,而jdk8之后就是直接把新元素掛在老元素的后面
?注意點:
LinkedHashSet詳解:? 底層跟HashSet一樣,不過在其基礎上加上了數據之間的雙向鏈表結構,使得其變成有序的
TreeSet詳解:? 底層是紅黑樹,性能好
總結:各種單列集合的應用場景: