日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字节一面 —— List 和 Map、Set 的区别

發布時間:2023/12/10 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字节一面 —— 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進行了底層優化,改為了由?數組+鏈表或者數值+紅黑樹實現,主要的目的是提高查找效率

  • Jdk8數組+鏈表或者數組+紅黑樹實現,當鏈表中的元素超過了 8 個以后, 會將鏈表轉換為紅黑樹,當紅黑樹節點 小于 等于6 時又會退化為鏈表。
  • 當new HashMap():底層沒有創建數組,首次調用put()方法示時,底層創建長度為16的數組,jdk8底層的數組是:Node[],而非Entry[],用數組容量大小乘以加載因子得到一個值,一旦數組中存儲的元素個數超過該值就會調用rehash方法將數組容量增加到原來的兩倍,專業術語叫做擴容,在做擴容的時候會生成一個新的數組,原來的所有數據需要重新計算哈希碼值重新分配到新的數組,所以擴容的操作非常消耗性能.
  • 默認的負載因子大小為0.75,數組大小為16。也就是說,默認情況下,那么當HashMap中元素個數超過16*0.75=12的時候,就把數組的大小擴展為2*16=32,即擴大一倍。

  • 在我們Java中任何對象都有hashcode,hash算法就是通過hashcode與自己進行向右位移16的異或運算。這樣做是為了計算出來的hash值足夠隨機,足夠分散,還有產生的數組下標足夠隨機

  • 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沖突
    不同的對象算出來的數組下標是相同的這樣就會產生hash沖突,當單線鏈表達到一定長度后效率會非常低。
  • 在鏈表長度大于8的時候,將鏈表就會變成紅黑樹,提高查詢的效率。


  • ?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 的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。