概述Java中的數據結構是什麼及其內部實現原理

2020-12-17 很神很奇很神奇

本文主講介紹幾種常用的數據結構,數據結構是一種容器的一個分支,容器時用來裝東西的,那麼數據結構就是專門用來存儲數據的容器。首先我們從數組來給大家漸漸引入數據結構,容器的概念。那麼數組是什麼呢,數組是一個對象,準確的說我們將對象進行分類,具有特定功能的對象就被成為數據結構或者容器,集合等,數組就是其中之一。有一個人說過程序就是算法與數據結構,這句話大體上能夠描述程序。

我們從數組的特性來慢慢延伸到集合。如果面試官要你介紹一下數組該怎麼說呢,它的容量是固定的,其中每個元素對應一個唯一的下標,通過下標我們可以找到相應的元素,那麼這種通過K找到V的結構我們稱為表對吧。

首先從數組的容量來看,它的容量是在一開始被創建就固定了的,如int[] i={1,2,3};或者int[] is=new int[8];那我們如何對數組進行擴容呢,看如下代碼

擴容用乘法,縮減用除法,使用原有數組長度作為一個新的標準量來參照擴大或縮小的倍數,那為什麼不手動輸入一個數字來定義數組大小呢,那樣就把代碼寫死了,實際上應該是原數組長度*n。我們除了會對容量進行操作外,其次就是最重要的增刪了,改是非常簡單的,直接通過下標取出元素然後賦值即可。那麼我該如何向數組中刪除一個元素呢

這是我剛剛學習java時寫的一小段代碼,它用於刪除數組指定下標的元素,邏輯就是將要刪除的下標置換到數組尾部然後縮減數組長度,添加也是同樣的方法,總之是非常的麻煩,那麼對數組這種結構可以歸納為數組是一種被創建時長度固定,難增刪的數據結構,但是它由於有下標作為索引所以能夠快速定位到指定下標的元素,同時java.util.Arrays是JDK提供的對數組操作的工具類,它用於幫助我們更好地使用數組,包括

//Arrays.sort(a, c);//Arrays.binarySearch(a, key) //Arrays.deepEquals(a1, a2) //Arrays.parallelPrefix(array, op); //Arrays.stream(array)

這幾種方法,第一個排序,第二個使用二分法搜索,第三個判斷兩個數組是否每個元素都一致,第四第五都是JDK8提供的,用於函數式編程。其他還有fill填充等,可以自己挨個去看看。

它還有一個很有意思的方法叫做Arrays.asList(),該方法要求傳入一個數組變量然後能夠將數組轉為List,那麼List是什麼呢?

List是一種非常常用的數據結構,叫做鍊表。為了避免數組插入和刪除對資源的線性開銷,就是數組長度越長添加元素耗費的資源就越多,使用不連續存儲的鍊表就能夠解決這個問題。鍊表的思想是每個元素首位相連,因為叫做鍊表所以它其實還是一種KV結構,第一個元素的V作為第二個元素的K,第二個元素的V作為第三個元素的K,最後一個元素的V為null。如果不明白的話可以想像一下電影人體蜈蚣,這種結構的好處就是我們對其增刪只需要斷開前一個元素的V和後一個元素的K即可,就像插件一樣,是可插拔的。List是一個接口,它有兩個子類,ArrayList和LinkedList,看名字就可以看得出一種是基於數組實現另一個是基於鍊表實現的。LinkedList相比ArrayList而言有更高效的插入和刪除執行速度, LinkedList才是真正意義上的鍊表。鍊表的特點就是增刪快,但是搜索指定元素消耗的資源也是呈現線性增長的。

除了數組和鍊表之外還有很多很多種延伸出的結構被用作不同的應用場景,如果你理解數組和鍊表那麼遇到新的數據結構也會容易上手,也可以自定義一個自己需要的容器。Set是一種自帶去重的容器,它和List一樣同屬Collection的子類,特點就是不會出現重複元素。有兩個常用子類hashSet和linkedHashSet,hashSet的內部是一個hashMap,特點是取出元素的順序不一定與存入順序一致,它沒有一個專門用於記錄順序的索引, linkedHashSet是一個有序的set,它有專門用於記錄順序的索引。

下一個數據結構就是Map,map是一種特殊的結構,它內部儲存的是鍵值對,與List都是同為表,區別就是map的K是可以被我們使用的,它將K,V封裝為一個整體Entry,這裡的Entry作為一個元素,相當於List中的一個元素,然後Entry中還有兩個元素K和V。Map接口有一個上面提到過的子類HashMap,只要看帶有Hash前綴的容器就說明,它的索引是由哈希算法也叫散列算法計算得出的,它是一種摘要算法也就是我們常用的md5,sha256的原型,這種算法計算得出的索引是唯一的,那麼map的特點就是Entry中的K唯一,V可以重複。它也提供了很多自己獨有的API,所以map的應用面積較廣。本次代碼較少,接下來將從代碼層面深入講解每個容器的實現。

相關焦點

  • Java中volatile特性概述
    volatile特性概述volatile總體概覽在上節中,我們已經研究完了volatile可以實現並發下共享變量的可見性,除了volatile可以保證可見性外,volatile 還具備如下一些突出的特性:volatile的原子性問題:volatile
  • Java類隔離加載實現原理是什麼?
    Java類隔離加載實現原理是什麼? JVM 提供一個全局類加載器的設置接口,直接替換全局類加載器,但無法解決多個自定義類加載器同時存在的問題。然而JVM會選擇當前類的類加載器來加載所有該類的引用的類。類隔離技術是什麼?
  • java數據結構系列——什麼是數據結構
    現在需要從水池中盛出3升水。」請問如何實現?別上網搜索先想想,這是我一個朋友最近在面試北京一家公司時被問到的一個問題。我感覺挺有趣的,咱們可以在評論區探討一下。數據結構系列文章我是抱著學習的心態來寫的。如果有哪些地方寫得不好的,解釋不到位的,寫的有問題的,希望大家可以提出來,幫我糾正。也希望可以和大家共同成長,一起進步。
  • 作為一個Java 程式設計師 你應該會什麼
    Mysql資料庫優化資料庫底層數據結構索引數據存儲結構 innodb詳解SQL調優及原理分庫、分表實現Nginx調優動靜資源分離nginx參數詳解nginx + lua使用應用:ip過濾,扛DDOSTomcat調優Tomcat源碼、架構分析Tomcat具體調優參數設置Tomcat壓力基準測試Tomcat NIO配置雙十一技術架構專題-九陽真經
  • Java中內部類到底有什麼用?
    java中內部類種類較多,語法比較複雜,用法也不盡相同。概括下來,可以分類為以下五種內部類。普通內部類的語法大致就是這樣了。那麼,回到我們主題。內部類到底有什麼用?我們在實際項目中,應該如何使用內部類呢?
  • 步進電機原理及內部結構
    一體化步進電機什麼是步進電機,步進電機原理及內部結構是什麼,從家中的簡單DVD播放器或印表機到高度複雜的數控工具機或機械臂,步進電機幾乎無處不在。它能夠實現電子控制的精確運動,使這些電機可以應用於許多類似的監視器,硬碟,數控工具機,3D印表機,機器人,裝配機器人,雷射切割機等等。在本文中,讓我們了解這些電機的特殊之處及其背後的理論。步進電機簡介與所有電機一樣,步進電機也有定子和轉子,但與普通直流電機不同,定子由各組線圈組成。
  • GTO的基本結構和基本工作原理是什麼?詳細概述
    打開APP GTO的基本結構和基本工作原理是什麼? 圖1  典型的GTO結構圖 GTO的基本結構和基本工作原理與普通晶閘管大同小異,只是為了實現門極關斷和提高門極的控制能力而擴大了P區(與門極接觸)對N+發射區(與陰極接觸)的相對面積,並將N+區化整為零,分置於
  • 就是要你懂 Java 中 volatile 關鍵字實現原理
    按照讀取順序與CPU結合的緊密程度,CPU緩存可分為:一級緩存:簡稱L1 Cache,位於CPU內核的旁邊,是與CPU結合最為緊密的CPU緩存二級緩存:簡稱L2 Cache,分內部和外部兩種晶片,內部晶片二級緩存運行速度與主頻相同,外部晶片二級緩存運行速度則只有主頻的一半三級緩存:簡稱L3 Cache,部分高端CPU才有每一級緩存中所存儲的數據全部都是下一級緩存中的一部分
  • JAVASE -- 語言概述和JAVA
    見延伸學習1、什麼是軟體開發1.1、軟體定義軟體就是按照特定的順序把數據和指令組合在一起,能夠完成相應功能的程序(計算機指令)。Java EE 是在Java SE 的基礎上構建的,它提供Web 服務、組件模型、管理和通信API,可以用來實現企業級的面向服務體系結構(service-oriented architecture,SOA)和Web 2.0 應用程式。
  • Java ArrayList 工作原理及實現
    www.cnblogs.com/try-better-tomorrow公眾號註:集合源碼解析,點擊文末閱讀原文直達1.概述以數組實現。ArrayList是一個相對來說比較簡單的數據結構,最重要的一點就是它的自動擴容,可以認為就是我們常說的「動態數組」。
  • 難道python才可以做數據抓取?今天就使用Java實現疫情數據抓取
    相信很多人像我一樣每天醒來就會看看疫情的數據,身為軟體工程專業的一員,也要充分發揮專業能力,為疫情做點什麼。設計思路使用爬蟲爬取網站中的數據並存入資料庫使用java做後端將資料庫的內容傳送到前端前端使用echarts框架對數據進行可視化技術棧開發語言Java開發工具Idea資料庫MySQL使用的第三方庫Jsoup:數據抓取gson:JSON轉換jQuery:ajax請求、DOM操作Echarts: 地圖可視化功能概述數據抓取和持久化項目抓取匯總數據及持久化抓取疫情地圖數據及持久化抓取動態播報數據及持久化疫情數據可視化項目疫情匯總數據可視化疫情地圖可視化省市詳情數據可視化動態播放可視化項目截圖
  • ...Java數據結構List,Set,Map,Spring執行流程,Spring MVC組件
    底層是以hash表實現的。---|TreeSet紅-黑樹的數據結構,默認對元素進行自然排序(String)。如果在比較的時候兩個對象返回值為0,那么元素重複。而在迭代訪問時發而更快,因為它使用鍊表維護內部次序。TreeMap //底層是二叉樹數據結構,線程不同步,可用於給Map集合中的鍵進行排序。HashTable //HashMap是Hashtable的輕量級實現,非線程安全的實現他們都實現了map接口,主要區別是HashMap鍵值可以為空null,效率可以高於Hashtable。
  • java第三章循環結構和random知識點總結
    ForTest02 {public static void main(String[] args) {//求和的最終結果必須保存起來,需要定義一個變量,用於保存求和的結果,初始值為0int sum = 0;//從1開始到5結束的數據,使用循環結構完成for(int i=1; i<=5; i++) {//將反覆進行的事情寫入循環結構內部
  • Java最常見600+面試題全解析:面試必備
    Java跨平臺原理(字節碼文件、虛擬機)2. Java的安全性3. Java三大版本4. 什麼事JVM、什麼事JDK、什麼是JRE?5. Java三種注釋類型6. 8種基本數據類型及其字節數7. i++和++i得異同之處8.
  • Java 8 Lambda 的實現原理及源碼剖析
    Lambda表達式經過編譯之後,到底會生成什麼東西呢?在沒有深入分析前,讓我們先想一想,Java 8中每一個Lambda表達式必須有一個函數式接口與之對應,函數式接口與普通接口的區別,可以參考前面的內容,那麼你或許在想Lambda表達式是不是轉化成與之對應的函數式接口的一個實現類呢,然後通過多態的方式調用子類的實現呢,如下面代碼是一個Lambda表達式的樣例:@FunctionalInterfaceinterface
  • 這裡有675道Java面試題,你準備好接招了嗎?(完整版)
    Java跨平臺原理(字節碼文件、虛擬機)2. Java的安全性3. Java三大版本4. 什麼是JVM、什麼是JDK、什麼是JRE?5. Java三種注釋類型6. 8種基本數據類型及其字節數7. i++和++i的異同之處8.
  • 一篇文章讓你了解二分搜索樹的數據結構的實現過程(Java 實現)
    樹結構簡介在線性數據結構中,數據都是排成一排存放的;而樹結構則是非線性的,存儲在其中的數據是按分支關係組織起來的結構,就像自然界中的樹那樣。對於這種組織結構,日常生活中是非常常見的,比如電腦磁碟中的文件夾、公司中的人員組織結構、家族的族譜等等,如以下幾圖所示:除了組織數據,使用樹結構存儲數據時,在某些情況下,處理數據是十分高效的。
  • 乾冰清洗機內部結構與設備原理
    乾冰清洗機屬於環保型非接觸高效清洗,由於乾冰清洗設備其非接觸清洗的原理,帶來了乾冰清洗工藝的持續創新,逐步形成新工業環保清洗的產業帝國,非接觸環保雪花爆炸等這些修飾詞來形容乾冰清洗的特性原理,讓很多躍躍欲試的客戶想儘快嘗試,同時也更迫切的希望腦補一下乾冰清洗機內部結構是什麼構成的,
  • 傳智播客:Java學科API的概述以及Scanner的操作
    今日內容:API概述Scanner類學完目標:能夠明確API的使用步驟能夠使用Scanner類獲得鍵盤錄入的數據一、API概述:API,全稱:Application Programming Interface,名詞解釋:應用程式編程接口。
  • 作業系統原理、數據結構、網絡原理,深入理解計算機系統應該按什麼順序去看?
    回到主題作業系統原理,這點主要幾乎貫徹整個軟體行業,無論什麼語言的編程寫的程序幾乎都是在帶有作業系統的環境下運行,當然單片機很多是不帶作業系統,單片機稍微一轉化就是嵌入式了,常見的cpu輪轉以及任務的優先級都屬於作業系統範疇,數據操作過程中數據塊的保護加鎖也是作業系統概念,所以掌握這門課程是程式設計師的必備,用的最多的當屬於嵌入式開發,稍微延伸一點程式設計師的開發環境,很多程式設計師喜歡在linux