【數據結構】Map與Set結構詳解

數據結構系列五:Map與Set(一)

一、接口的實現

1.方法上

2.成員上

二、Map的內外雙接口結構

1.實現

1.1外部Map接口的實現

1.1.1臨摹整體

1.1.2外部類實現整體

1.2內部Entry接口的實現

1.2.1臨摹內部

1.2.2內部類實現內部

2.關系

3.意義

3.1邏輯內聚

3.2訪問封裝

3.3成套對應

三、Map實現類的存儲結構

1.包裝節點對象

2.數據組織結構

2.1數組+鏈表/紅黑樹

2.1.1結構

2.1.2順序

2.1.3復雜度

2.2紅黑樹

2.2.1結構

2.2.2順序

2.2.3復雜度

四、Map接口里的方法使用

1.外接口Map

1.1查詢

1.1.1鍵查詢值(無默認值):

1.1.2鍵查詢值(有默認值):

1.2修改:

1.3刪除:

1.4判斷

1.4.1判斷鍵存在:

1.4.2判斷值存在:

1.5獲取

1.5.1獲取所有鍵:

1.5.2獲取所有值:

1.5.3獲取所有包裝節點:

2.內接口Entry

2.1獲取

2.1.1獲取節點的鍵:

2.1.2獲取節點的值:

2.2修改:

五、Set接口

1.復用性

2.定義分類

六、Set接口里的方法使用

1.獲取

1.1獲取所有元素:

1.2獲取元素個數:

1.3獲取迭代器:

2.添加

2.1添加一個元素:

2.2添加集合元素:

3.刪除:

4.判斷

4.1判斷是否空:

4.2判斷一個元素存在:

4.3判斷集合元素存在:

5.清空:


一、接口的實現

接口是在實現類子類完整實現

1.方法上

接口處在被使用范圍下時,在意義編譯的要求下,一定要被連接有此接口的實現類 賦值向上轉型 使得里面的抽象方法都被重寫 有意義上

因為這些抽象方法都無方法體的,每個抽象方法設置?有點意義的 也就只有形參類型、返回值類型,無完整意義的,所以抽象方法的完整實現是在實現類子類里完成的


2.成員上

接口里一般不會定義成員變量,更多時候成員變量都是在實現類子類這邊 結合臨摹要實現的抽象方法,在可創建的各樣對象中根據具體需求 選擇針對性地自定義實現的,從而達到接口實現的多樣化,所以接口設置成在實現類里面創建成員變量是接口能多樣化實現的保障


二、Map的內外雙接口結構

public interface Map<K, V> {//外部Map整體接口//Map接口臨摹 從外部、握整體操作包裝節點:V put(K key, V value);V get(Object key);V remove(Object key);void putAll(Map<? extends K, ? extends V> m);void clear();...interface Entry<K, V> {//內部Entry局部接口//Entry接口臨摹 每個包裝節點對象自己對自身的操作:K getKey();V getValue();V setValue(V value);}
}

1.實現

1.1外部Map接口的實現

1.1.1臨摹整體

外部Map整體接口抽象方法 臨摹著 從外部、握整體地能操作著?所有鍵值成對包裝單位體


1.1.2外部類實現整體

對應到具體實現類那邊,外部Map整體接口的實現類果真就額外 操作所有包裝單位整體的 入口成員變量,再配著?重寫著的操作整體的實現方法外部Map整體接口的實現類(即實現類整體中不包含內部Entry實現類的 外部Map實現類部分)實現了對包裝單位從整體的操作


1.2內部Entry接口的實現

1.2.1臨摹內部

內部Entry局部接口抽象方法 臨摹著 從內部包裝單位體自身對自己范圍內的內部操作


1.2.2內部類實現內部

對應到具體實現類那邊,內部Entry局部接口實現類就額外有 包裝單位自身的組成信息成員變量,配合著 重寫著的包裝單位自身內部操作實現方法內部Entry局部接口實現類就也實現了 它每創的包裝單位對象都能實現對自身信息的操作


2.關系

在每個Map實現類中,向整體Map接口向上轉型間接實例的 從整體操作所有包裝單位的 實例對象就只有它一個,而由它的內部類 向上轉型Entry接口間接實例化的包裝單位對象 創建得可就多了,即外部實現類Map一個實例對象管理著 內部類Entry的許多實例對象


3.意義

3.1邏輯內聚

接口里面裝內部接口,內部接口Entry能訪問外部接口Map 就直接固定設置成相同的泛型參數K、V 直接保證上 從整體視角與個體視角管理包裝單位都要的 類型恒統一


3.2訪問封裝

內部接口加層封裝于 外部使用者接口里面,使內部接口受正確限訪問,包裝得更加針對且安全


3.3成套對應

外部接口實例化時,由于抽象相關的 在去使用了的范圍內 必須要重寫實現上其意義,因此外部接口的實現類 也同時要求著 去重寫實現有 內部接口相關的所有抽象的東西,即也要求同時有去實例化內部接口 也實現它的意義,所以這也就使得有內部接口的接口實例化 需要對應 有內部類的實現類實現,接口與類對應著實現的(接口的實例化都是間接的)


三、Map實現類的存儲結構

在Map對應實現類的引用管理對象體系中,最上層Map實現類的實例對象 通過分層向下管理 來組織基本節點對象的數據組織結構 或者由基本對象節點自連串自己 組織成數據組織結構,實現著最上層類引用對象 管理著 成組織數據結構中的每個單位基本節點對象


1.包裝節點對象

Map數據結構里面的基本操作單位關鍵字對象與值對象對應兩合并成的一個 鍵值對包裝對象(String與Integer兩合并包裝成一個對象),而其它數據結構的基本操作單位都是一個底層直接對象(以Integer一個對象為基本操作單位)


2.數據組織結構

2.1數組+鏈表/紅黑樹

2.1.1結構

HashMap數組+鏈表/紅黑樹數據組織結構 組織包裝節點對象

  • 包裝節點的鍵值 通過哈希函數計算映射到數組索引 來確定存放,每個數組元素哈希桶里面都是存放包裝節點自實現作的一個鏈表頭節點或者根節點

包裝節點映射到數組同一位置時,節點會自連接組織 連接進桶里存放,到鏈表過長時 此數組元素哈希桶里面的鏈表節點 都會通過Node類extend繼承擴展轉為TreeNode類 全部轉為紅黑樹節點 轉化成裝紅黑樹的哈希桶結構(提高查詢效率)來繼續存放在 此數組索引位置


2.1.2順序

通過哈希函數計算映射索引 來確定元素在數組位置的元素們用此函數來確定的位置之間 是無序


2.1.3復雜度

一次哈希函數計算映射 就能鎖定元素位置,數據操作查插刪的時間復雜度都是O(1),哈希結構的存儲能實現數據的極速操作


2.2紅黑樹

2.2.1結構

TreeMap中,通過包裝單位里面 定義自己自連串組織結構包裝單位們能 自組織成紅黑樹的結構(一種自平衡的二叉搜索樹)


2.2.2順序

包裝單位按照鍵值的順序 有序地在樹中存儲


2.2.3復雜度

通過比較搜索來確定元素的,數據操作查插刪的時間復雜度都是O(logN),即樹的高度次


四、Map接口里的方法使用

Map接口里只有抽象方法的臨摹,抽象方法的實現、成員變量的定義存在、數據結構的組織都是在實現類TreeMap、HashMap中才有去實現的

1.外接口Map

外部接口對應實現的外部類 完成從外部整體 對自己里面創建的所有包裝節點整體操作:

1.1查詢

1.1.1鍵查詢值(無默認值):

t/hMap.get(Object key);

—> return V

查詢獲取 此map實現類創建的 包裝節點數據組織結構里 某鍵值對象對應的 包裝節點里的

1.1.2鍵查詢值(有默認值):

t/hMap.get(Object key,V defaultValue);

—> return V

查詢獲取 此map實現類里面的 此鍵對應的包裝節點,如果此創建的數據節點結構中 沒有此鍵值的包裝節點,則返回默認值


1.2修改:

t/hMap.put(K key,V value);

—> return V

修改設置 實現類map里面創建存儲的 某對應的 包裝節點里的


1.3刪除:

t/hMap.remove(Object key)

—> return V

查詢刪除 map里面對應的包裝節點,并將此包裝節點里的對象返回


1.4判斷

1.4.1判斷鍵存在:

t/hMap.containsKey(Object key);

—> return boolean

判斷map實現類里面創建的 所有包裝節點中是否含有此對象

1.4.2判斷值存在:

t/hMap.containsValue(Object value);

—> return boolean

判斷map實現類里面創建的 所有包裝節點中是否含有此對象


1.5獲取

1.5.1獲取所有鍵:

t/hMap.keySet();

—> return Set<K>

將map實現類里面創建的 所有包裝節點的對象 存放在Set集合中返回獲取

1.5.2獲取所有值:

t/hMap.values();

—> return Collection<V>

將map實現類里面創建的 所有包裝節點的對象 存放在Collection集合中返回獲取(Set集合里面不會存放重復的值,value的值是可有重復的,就不要用Set集合接收 來用Collection集合接收了)

1.5.3獲取所有包裝節點:

t/hMap.entrySet();

—> return Set<Map.Entry<K,V>>

將map實現類里面創建的 所有包裝節點向上轉型回 接口類型的包裝節點,存放在Set集合中返回獲取


2.內接口Entry

內部接口對應實現的內部類 完成從內部每個包裝節點對自身的操作HashMap實現類里面用Node內部類 對應實現Entry內部接口,TreeMap實現類里面 用Entry內部類 來對應實現Entry內部接口:

2.1獲取

2.1.1獲取節點的鍵:

t/hEntry.getKey();

—> return K

獲取該包裝節點里面裝的對象

2.1.2獲取節點的值:

t/hEntry.getValue();

—> return V

獲取該包裝節點里面裝的對象


2.2修改:

t/hEntry.setValue(V value);

—> return V

將該包裝節點里面的值對象 修改設置為指定對象


五、Set接口

1.復用性

Set與Map結構都是一樣的,只是Set使用時 它的基本節點 鍵值包裝對象 里面的值對象 統一設置成了Object類對象 來填充,相當于 不管查詢意義的Object 連著存儲,實現的也就是只針對鍵對象的 不重復數據的存儲,它里面的元素 實際上就是包裝節點下鍵值


2.定義分類

Set實現類的底層 也都是復用Map實現類的那套定義的基本操作對象 也都還是包裝節點,但已忽略掉了值對象,相當于只存一個不會重復的 鍵對象節點了,所以在集合中把它單獨定義分類出來 視為元素,所以在集合中它的接口Set、它的實現類TreeSet、TreeMap都是定義在Collection接口下的


六、Set接口里的方法使用

Set接口里也是只有抽象方法的臨摹,方法的具體實現、方法的操作對象也都在實現類TreeSet、TreeMap中 定義進行的

1.獲取

1.1獲取所有元素:

t/hSet.toArray();

—> return Object[]

將此set集合中的所有元素 裝到數組中返回

1.2獲取元素個數:

t/hSet.size();

—> return int

獲取此set集合中的元素個數

1.3獲取迭代器:

t/hSet.iterator();

—> return Iterator<E>

獲取對應迭代此set集合元素的迭代器


2.添加

2.1添加一個元素:

t/hSet.add(E e);

—> return boolean

往此set實現類里面 添加存儲一個元素,如果在實現類里面 元素已存儲有,則不會添加成功

2.2添加集合元素:

t/hSet.addAll(Colleaction<? extends E> c);

—> return boolean

將集合c中的元素 全部添加到此set集合中,可以達到去重效果


3.刪除:

t/hSet.remove(Object o);

—> return boolean

刪除set實現的集合中的o對象元素


4.判斷

4.1判斷是否空:

t/hSet.isEmpty();

—> return boolean

判斷此set集合是否為空

4.2判斷一個元素存在:

t/hSet.contains(Object o);

—> return boolean

判斷此set集合中是否有o對象元素

4.3判斷集合元素存在:

t/hSet.containsAll(Collection<?> c);

—> return boolean

判斷此set集合中 是否全部包含 集合c里面的所有元素


5.清空:

t/hSet.clear();

—> return void

清空此set集合?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80248.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80248.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80248.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Electron使用WebAssembly實現CRC-32 原理校驗

Electron使用WebAssembly實現CRC-32 原理校驗 將C/C語言代碼&#xff0c;經由WebAssembly編譯為庫函數&#xff0c;可以在JS語言環境進行調用。這里介紹在Electron工具環境使用WebAssembly調用CRC-32 原理格式校驗的方式。 CRC-32 原理校驗函數WebAssembly源文件 C語言實現C…

【晶振】晶振的工作原理及其與單片機關系

晶振(晶體振蕩器)是電子設備中常見的元件,其核心功能是提供穩定的時鐘信號,而單片機(MCU)依賴這一信號來同步內部操作。以下是晶振的工作原理及其與單片機關系的詳細說明: 一、晶振的工作原理 壓電效應與諧振 晶振的核心是石英晶體,利用其壓電效應: 當在晶體兩端施加電…

【Oracle專欄】函數中SQL拼接參數 報錯處理

Oracle相關文檔,希望互相學習,共同進步 風123456789~-CSDN博客 1.背景 最近同事反饋了一個很奇怪的問題,即有一個函數,入參是當前年月,主要作用是通過SQL語句將不合規的數據插入到指定表中,插入數據時帶上入參的年月參數。當前問題:單獨測試SQL沒有問題可以執行成功,…

nodejs之Express-介紹、路由

五、Express 1、express 介紹 express 是一個基于 Node.js 平臺的極簡、靈活的 WEB 應用開發框架,官方網址: https://www.expressjs.com.cn/ 簡單來說,express 是一個封裝好的工具包,封裝了很多功能,便于我們開發 WEB 應用(HTTP 服務) (1)基本使用 第一步:初始化項目并…

Unicode和 ASCII碼以及UTF-8編碼的區別和聯系

Unicode、ASCII 和 UTF-8 是計算機編碼領域的關鍵概念&#xff0c;它們既有聯系又有區別。以下是它們的對比分析&#xff1a; 1. ASCII&#xff08;美國信息交換標準碼&#xff09; 誕生時間&#xff1a;1967 年&#xff08;7 位編碼&#xff0c;共 128 字符&#xff09;。特點…

STM32F103_HAL庫+寄存器學習筆記20 - CAN發送中斷+ringbuffer + CAN空閑接收中斷+接收所有CAN報文+ringbuffer

導言 如上所示&#xff0c;在[[STM32F103_HAL庫寄存器學習筆記19 - CAN發送中斷CAN接收中斷接收所有CAN報文ringbuffer數據結構]]的基礎上&#xff0c;為CAN發送端也引入了ringbuffer&#xff08;環形緩沖區&#xff09;機制。CAN發送有三個發送郵箱&#xff0c;為什么還另外需…

Windows 環境下安裝 MariaDB 及 HeidiSQL 使用教程

引言 本報告旨在提供一份詳盡的操作指南。內容將覆蓋在 Windows 操作系統上安裝 MariaDB Community Server 的全過程。我們還將探討如何利用 HeidiSQL 這款圖形用戶界面&#xff08;GUI&#xff09;工具&#xff0c;直觀地預覽和管理我們新安裝的數據庫。除了安裝與配置的步驟…

美團2024年春招第一場筆試 C++

目錄 1&#xff0c;小美的平衡矩陣 2&#xff0c;小美的數組詢問 3&#xff0c;小美的MT 4&#xff0c;小美的朋友關系 1&#xff0c;小美的平衡矩陣 【題目描述】 給定一個n*n的矩陣&#xff0c;該矩陣只包含數字0和1。對于 每個i(1<i<n)&#xff0c;求在該矩陣中&am…

09-DevOps-Jenkins實現CI持續集成

前面已經把harbor搭建好了&#xff0c;也可以向harbor中推送自定義鏡像。 原計劃是在Jenkins這臺服務器上&#xff0c;完成鏡像構建&#xff0c;然后把鏡像推送的harbor倉庫中。現在改變計劃了&#xff0c;Jenkins所在的服務器&#xff08;192.168.1.10&#xff09;不負責鏡像…

Postman設置了Cookies但是請求不攜帶Cookie

1 問題說明 使用Postman工具往往要向本地服務器發送請求攜帶Cookie便于測試接口&#xff0c;但是在Send下面的Cookies選項中設置域名127.0.0.1&#xff0c;并添加Cookie&#xff0c;發現發送的請求怎么都不會攜帶Cookie&#xff1a; 通過Fiddler抓包發現并沒有Cookie&#xff1…

【unity】Vulkan模式下部分Android機型使用VideoPlayer組件播放視頻異常問題

一、問題背景 考慮到Vulkan高性能的優勢&#xff0c;項目組決定打包設置為vulkan優先&#xff0c;opengl es次之的方案&#xff1b;但由于部分低端設備或者部分模擬器對Vulkan的兼容性良莠不齊&#xff0c;導致諸如使用VideoPlayer組件無法正常播放視頻等問題頻發&#xff0c;而…

0802api設計和實戰-網絡ajax請求1-react-仿低代碼平臺項目

文章目錄 1 API設計1.1 用戶功能1.1.1 獲取用戶信息1.1.2 注冊1.1.3 登錄 1.2 問卷功能1.2.1 獲取單個問卷1.2.2 獲取問卷列表1.2.3 創建問卷1.2.4 更新問卷1.2.5 批量徹底刪除問卷1.2.6 復制問卷 1.3 小結 2 實戰2.1配置axios2.2 封裝API和測試2.3 新建問卷2.4 自定義hooks封裝…

Android Kotlin AIDL 完整實現與優化指南

本文將詳細介紹如何在Android中使用Kotlin實現AIDL&#xff08;Android Interface Definition Language&#xff09;&#xff0c;并提供多種優化方案。 一、基礎實現 1. 創建AIDL文件 在src/main/aidl/com/example/myapplication/目錄下創建&#xff1a; IMyAidlInterface.…

【數據結構】_棧和隊列相關面試題

&#x1f525; 數據結構修煉場 &#x1f525; &#x1f4a5; 棧與隊列 終極試煉 &#x1f4a5; &#x1f680; 理論已加載完畢&#xff0c;代碼之魂覺醒時刻&#xff01; ?? 是時候用實戰點燃你的算法之力了—— 「題目風暴&#xff0c;來襲&#xff01;」 &#xff08;握…

精益數據分析(8/126):從Airbnb案例看精益創業與數據驅動增長

精益數據分析&#xff08;8/126&#xff09;&#xff1a;從Airbnb案例看精益創業與數據驅動增長 大家好&#xff01;一直以來&#xff0c;我都堅信在創業和技術的領域里&#xff0c;持續學習與分享是不斷進步的關鍵。今天&#xff0c;咱們繼續深入學習《精益數據分析》&#x…

專題二十:路由策略與策略路由

一、路由策略 1.1 路由策略的概念 路由策略是通過修改路由表的路由條目來控制數據流量的可達性。即對接受和發布的路由進過濾。這種方式稱為路由策略 路由策略功能相關作用控制路由的發布可通過路由策略對所要發布的路由信息進行過濾&#xff0c;只允許發布滿足條件的路由信…

VSCode 擴展離線下載方法

學習自該文章&#xff0c;感謝作者&#xff01; 2025 年 VSCode 插件離線下載攻略&#xff1a;官方渠道一鍵獲取 - 知乎 獲取擴展關鍵信息 方法一&#xff1a;官網獲取 打開 VSCode 擴展官方網站 搜索要下載的擴展&#xff0c;以 CodeGeeX 為例&#xff0c;網址為&#xf…

一 、環境的安裝 Anaconda + Pycharm + PaddlePaddle

《從零到一實踐&#xff1a;系統性學習生成式 AI(NLP)》 一 、環境的安裝 Anaconda Pycharm PaddlePaddle 1. Anaconda 軟件安裝 Anaconda 軟件安裝有大量的教程&#xff0c;此處不在說明&#xff0c;安裝完成之后界面如下&#xff1a; 2. 創建 Anaconda 虛擬環境 Paddl…

軟考教材重點內容 信息安全工程師 第23章 云計算安全需求分析與安全保護工程

23.1.云計算基本概念 云計算就是在這樣的需求驅動下而產生的一種計算模式。云計算通過虛擬化及網絡通信技術&#xff0c;提供一種按需服務、彈性化的 IT 資源池服務平臺。云計算的主要特征如下。 1. IT 資源以服務的形式提供 IT 資源以一種服務產品的形式提供&#xff0c;滿…

藍橋杯 19. 最大比例

最大比例 原題目鏈接 題目描述 X 星球的某個大獎賽設了 M 級獎勵。每個級別的獎金是一個正整數。 并且&#xff0c;相鄰兩個級別間的比例是一個固定值&#xff0c;也就是說&#xff1a;所有級別的獎金構成一個等比數列。 例如&#xff1a; 獎金數列為 16, 24, 36, 54&…