在數學中,集合就是在一個
List , Set, Map都是介面,前兩個繼承至Collection介面,Map為獨立介面
Collection
List(串列)有序且可重復
ArrayList
優點:底層資料結構是陣列,可以根據下標直接的找到對應的元素,所以查詢快,
缺點:但是因為陣列增刪需要移動元素,所以增刪的效率低,
執行緒不安全,效率高
Vector
Vector的底層是 陣列,優點和ArrayList一樣,但是執行緒安全,因此效率低下
Set(集合)無序且不可重復
Collection 使用fori回圈效率低下,通常使用迭代器:
1.iterator()
2.forEach(Consumer)
3.foreach 增強for回圈
ps:Set.add 相同內容的元素時會失敗,但是程式正常運行
HashSet:
底層資料結構是哈希表(HashTable)
為了確保元素不重復,需要依賴兩個方法:重寫hashCode比較,比較hash值,然后重寫equals,若哈希值相同,則繼續比較相同hash值的 內容是否一致
TreeSet:
支持自定義排序
底層資料結構是紅黑樹(不可重復,有序)
確保有序:
1.排序物件可以實作Comparable介面
2.或者 new TreeSet時,設定Comparator比較器,自定義排序規則
同時,根據比較的回傳值是否為0來確保元素的唯一性
————————————————————————————
那么在使用Collection集合時,我們選擇用誰呢?
元素是否不可重復(是否唯一),唯一的話,用Set 不唯一用List
用Set考慮是否有排序,排序用TreeSet或LinkedHashSet,不排序用HashSet
不確定的話默認用HashSet,
不唯一用List
用List考慮是否需要安全性,需要就用Vector,不需要就用ArrayList或者LinkedList(查詢多用:ArrayList
增刪多用:LinkedList)
不確定的話默認用ArrayList,
Collections工具類
- ArrayList 和 LinkedList 的區別
ArraysList底層采用的是動態 陣列 進行存盤,陣列單向關聯,
LinkedList使用的是鏈表結構,每個元素由 : 向前關聯節點,向后關聯節點,元素值組成
如果頻繁進行查詢操作,優先使用ArraysList,
因為ArraysList可以直接回傳陣列中index位置的元素,訪問集合元素時性能更高
如果進行修改操作較多,應該使用LinkedList
因為LinkedList,不需要改變陣列的大小,
也不需要在陣列裝滿的時候要將所有的資料重新裝入一個新的陣列,LinkedList中插入或洗掉的時間復雜度僅為O(1),
- ArrayList 和 Vector 的區別(自行百度,掌握)
相同點:
1、ArrayList和Vector都是繼承了相同的父類和實作了相同的介面List
2、底層都是陣列實作的
3、初始默認長度都為10,
不同點:
1) Vector的方法都是同步的(Synchronized),是執行緒安全的(thread-safe),
而ArrayList的方法不是,由于執行緒的同步必然要影響性能,因此,ArrayList的性能比Vector好,
2) 當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍
而ArrayList只增加50%的大小,這樣,ArrayList就有利于節約記憶體空間,
3) HashSet 是如何 實作 值的去重的
呼叫HashSet中的add方法時,hashCode方法來獲取哈希值,
如果哈希值相同,再會繼續比較 equals 如果相同,說明兩個元素相同,不會存盤對應的元素
如果不同,則進行存盤,
- TreeSet 在使用的時候,需要注意什么事項
1.TreeSet存盤資料 有序,不重復
2.呼叫 add() 方法時會呼叫物件類實作的 Comparable 介面的 compareTo()方法
來與集合中的物件比較,根據方法回傳的結果有序存盤
使用TreeSet存盤時,物件類需要實作 Comparable 介面 或者
在使用構造器時,傳入一個 compartor 介面的實作類物件,自己規定排序規則,
- HashMap 和 Hashtable 有什么區別 (自行百度、掌握)
1.HashMap允許空值作為鍵和值,而HashTable不允許空),
2.HashMap是非同步的 非執行緒安全,
Hashtable是同步的,執行緒安全,
- HashMap 的底層原理 (明天講、提前了解,現在能掌握最好)
HashMap是陣列+鏈表+紅黑樹(JDK1.8增加了紅黑樹部分)實作的
HashMap基于Map介面實作,元素以鍵值對的方式存盤,并且允許使用null 建和null值,
因為key不允許重復,因此只能有一個鍵為null,另外HashMap不能保證放入元素的順序,它是無序的,和放入的順序并不能相同,HashMap是執行緒不安全的,
HashMap的初始容量為16,HashMap擴容時是當前容量翻倍即:capacity*2
map.put(k,v)實作原理
第一步首先將k,v封裝到Node物件當中(節點),
第二步它的底層會呼叫K的hashCode()方法得出hash值
第三步通過哈希表函式/哈希演算法,將hash值轉換成陣列的下標,下標位置上如果沒有任何元素,就把Node添加到這個位置上,如果說下標對應的位置上有鏈表,
此時,就會拿著k和鏈表上每個節點的k進行equal,如果所有的equals方法回傳都是false,那么這個新的節點將被添加到鏈表的末尾,如其中有一個equals回傳了true,那么這個節點的value將會被覆寫,
map.get(k)實作原理
第一步:先呼叫k的hashCode()方法得出哈希值,并通過哈希演算法轉換成陣列的下標,
第二步:通過上一步哈希演算法轉換成陣列的下標之后,在通過陣列下標快速定位到某個位置上,重點理解如果這個位置上什么都沒有,則回傳null,
如果這個位置上有單向鏈表,那么它就會拿著引數K和單向鏈表上的每一個節點的K進行equals,如果所有equals方法都回傳false,則get方法回傳null,
如果其中一個節點的K和引數K進行equals回傳true,那么此時該節點的value就是我們要找的value了,get方法最侄訓傳這個要找的value,
集合筆記,轉自博主:檾辭
轉侵刪
傳送門
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295573.html
標籤:其他
上一篇:程式員面試題01