字节一面 —— List 和 Map、Set 的区别
馬上就要到金三銀四佳季了,是找工作的好時候,小伙伴們一定要把握好時機,找到心儀的高薪工作。找工作就少不了面試,那我們從現在開始,多刷刷面試題,查缺補漏!!!
目錄
?常見的數據結構?
?集合和數組的區別?
?List 和 Map、Set 的區別?
?List 和 Map、Set 的實現類?
?Hashmap的底層原理?
?Hashmap和hashtable ConcurrentHashMap區別?
?
?常見的數據結構?
?
常用的數據結構有:數組,棧,隊列,鏈表,樹,散列,堆,圖
?
數組是最常用的數據結構,數組的特點是長度固定,數組的大小固定后就無法擴容了?,數組只能存儲一種類型的數據?,添加,刪除的操作慢,因為要移動其他的元素。
棧是一種基于先進后出(FILO)的數據結構,是一種只能在一端進行插入和刪除操作的特殊線性表。它按照先進后出的原則存儲數據,先進入的數據被壓入棧底,最后的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最后一個數據被第一個讀出來)。
隊列是一種基于先進先出(FIFO)的數據結構,是一種只能在一端進行插入,在另一端進行刪除操作的特殊線性表,它按照先進先出的原則存儲數據,先進入的數據,在讀取數據時先被讀取出來。
鏈表是一種物理存儲單元上非連續、非順序的存儲結構,其物理結構不能只表示數據元素的邏輯順序,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列的結節(鏈表中的每一個元素稱為結點)組成,結點可以在運行時動態生成。根據指針的指向,鏈表能形成不同的結構,例如單鏈表,雙向鏈表,循環鏈表等。?
樹是我們計算機中非常重要的一種數據結構,同時使用樹這種數據結構,可以描述現實生活中的很多事物,例如家譜、單位的組織架構等等。有二叉樹、平衡樹、紅黑樹、B樹、B+樹。
散列表,也叫哈希表,是根據關鍵碼和值 (key和value) 直接進行訪問的數據結構,通過key和value來映射到集合中的一個位置,這樣就可以很快找到集合中的對應元素。
堆是計算機學科中一類特殊的數據結構的統稱,堆通常可以被看作是一棵完全二叉樹的數組對象。
圖的定義:圖是由一組頂點和一組能夠將兩個頂點相連的邊組成的
?集合和數組的區別?
?
區別:數組長度固定 ??集合長度可變
數組中存儲的是同一種數據類型的元素,可以存儲基本數據類型,也可以存儲引用數據類型;
集合存儲的都是對象,而且對象的數據類型可以不一致。在開發當中一般當對象較多的時候,使用集合來存儲對象。
?List 和 Map、Set 的區別?
?
List和Set是存儲單列數據的集合,Map是存儲鍵值對這樣的雙列數據的集合;
List中存儲的數據是有順序的,并且值允許重復;
Map中存儲的數據是無序的,它的鍵是不允許重復的,但是值是允許重復的;
Set中存儲的數據是無順序的,并且不允許重復,但元素在集合中的位置是由元素的hashcode決定,即位置是固定的(Set集合是根據hashcode來進行數據存儲的,所以位置是固定的,但是這個位置不是用戶可以控制的,所以對于用戶來說set中的元素還是無序的)。
?List 和 Map、Set 的實現類?
?
(1)Connection接口:
List 有序,可重復
ArrayList
優點: 底層數據結構是數組,查詢快,增刪慢。
缺點: 線程不安全,效率高
Vector
優點: 底層數據結構是數組,查詢快,增刪慢。
缺點: 線程安全,效率低, 已給舍棄了
LinkedList
優點: 底層數據結構是鏈表,查詢慢,增刪快。
缺點: 線程不安全,效率高
Set?無序,唯一
HashSet
底層數據結構是哈希表。(無序,唯一)
如何來保證元素唯一性?
依賴兩個方法:hashCode()和equals()
LinkedHashSet
底層數據結構是鏈表和哈希表。(FIFO插入有序,唯一)
1.由鏈表保證元素有序
2.由哈希表保證元素唯一
TreeSet
底層數據結構是紅黑樹。(唯一,有序)
1. 如何保證元素排序的呢?
自然排序
比較器排序
2.如何保證元素唯一性的呢?
根據比較的返回值是否是0來決定
(2)Map接口有四個實現類:?
HashMap?
基于 hash 表的 Map 接口實現,非線程安全,高效,支持 null 值和 null?鍵,?線程不安全。
HashTable?
線程安全,低效,不支持 null 值和 null 鍵;?
LinkedHashMap?
線程不安全,是 HashMap 的一個子類,保存了記錄的插入順序;
TreeMap
能夠把它保存的記錄根據鍵排序,默認是鍵值的升序排序,線程不安全。
?Hashmap的底層原理?
?
HashMap在JDK1.8之前的實現方式?數組+鏈表,
但是在JDK1.8后對HashMap進行了底層優化,改為了由?數組+鏈表或者數值+紅黑樹實現,主要的目的是提高查找效率
默認的負載因子大小為0.75,數組大小為16。也就是說,默認情況下,那么當HashMap中元素個數超過16*0.75=12的時候,就把數組的大小擴展為2*16=32,即擴大一倍。
map.put(k,v)實現原理
(1)首先將k,v封裝到Node對象當中(節點)。
(2)先調用k的hashCode()方法得出哈希值,并通過哈希算法轉換成數組的下標。
(3)下標位置上如果沒有任何元素,就把Node添加到這個位置上。如果說下標對應的位置上有鏈表。此時,就會拿著k和鏈表上每個節點的k進行equal。如果所有的equals方法返回都是false,那么這個新的節點將被添加到鏈表的末尾。如其中有一個equals返回了true,那么這個節點的value將會被覆蓋。
map.get(k)實現原理
(1)、先調用k的hashCode()方法得出哈希值,并通過哈希算法轉換成數組的下標。
(2)、在通過數組下標快速定位到某個位置上。重點理解如果這個位置上什么都沒有,則返回null。如果這個位置上有單向鏈表,那么它就會拿著參數K和單向鏈表上的每一個節點的K進行equals,如果所有equals方法都返回false,則get方法返回null。如果其中一個節點的K和參數K進行equals返回true,那么此時該節點的value就是我們要找的value了,get方法最終返回這個要找的value。
不同的對象算出來的數組下標是相同的這樣就會產生hash沖突,當單線鏈表達到一定長度后效率會非常低。
?Hashmap和hashtable ConcurrentHashMap區別?
?
1、HashMap 是非線程安全的,HashTable 是線程安全的。
2、HashMap 的鍵和值都允許有 null 值存在,而 HashTable 則不行。
3、因為線程安全的問題,HashMap 效率比 HashTable 的要高。
4、Hashtable 是同步的,而 HashMap 不是。因此,HashMap 更適合于單線
程環境,而 Hashtable 適合于多線程環境。一般現在不建議用 HashTable, ①
是 HashTable 是遺留類,內部實現很多沒優化和冗余。②即使在多線程環境下,
現在也有同步的 ConcurrentHashMap 替代,沒有必要因為是多線程而用
HashTable。
HashTable 使用的是 Synchronized 關鍵字修飾,ConcurrentHashMap 是JDK1.7使用了鎖分段技術來保證線程安全的。JDK1.8ConcurrentHashMap取消了Segment分段鎖,采用CAS和synchronized來保證并發安全。數據結構跟HashMap1.8的結構類似,數組+鏈表/紅黑二叉樹。
synchronized只鎖定當前鏈表或紅黑二叉樹的首節點,這樣只要hash不沖突,就不會產生并發,效率又提升N倍。
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的字节一面 —— List 和 Map、Set 的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鬼吹灯《昆仑神宫》官宣 潘粤明、张雨绮、
- 下一篇: flink(一个流处理,一个批处理)