上一章節回顧java
在上一章節中已經對數據結構的基本概念有了瞭解,主要就是數據結構研究的三個方面(邏輯結構、存儲結構、算法)。還有兩個重要的詞彙:時間效率和空間效率。這一節開始瞭解最基本的數據結構-數組。程序員
說在前面的話算法
還須要說明一點,學習一個新的知識點的基本順序我以爲大致是這樣的。首先要知道其基本概念(還有分類),而後瞭解它的特性(特殊點),由於特性決定用途,接下來就是它的用途,最後就是他的底層實現原理。所以我之後基本上也會按照這種方式去講解一個新的知識點數組
。
數據結構
1、數組的基本概念app
一、什麼是數組?jvm
在平時使用最多的恐怕就是數組了吧,它是使用最普遍的一種數據結構,它是相同數據類型(能夠是基本類型也能夠是自定義類型)的元素按必定順序排列的集合,它們在內存中按照這個前後順序連續存放在一塊兒。有一維數組,二維數組,多維數組。 通俗的理解就是咱們通常把一羣羊或者一羣牛放在一個圈裏面,這個圈就至關於數組容器,每個羊至關於一個元素。ide
以上這個概念須要知道這幾個詞彙:相同數據類型、必定順序排列、集合、內存前後存放。學習
二、如何聲明一個數組spa
從標題就能夠看到,聲明和建立一個數組是兩個不一樣的過程。聲明的做用就好像是告訴別人我要去洗澡,建立的做用就好像是我真正的去洗澡了(比喻不當哈哈)。那如何聲明數組呢?
int[] students ; int students [];
從上面咱們看到這裏有兩種方式,但通常推薦第一種。畢竟第一種看起來可讀性更好一點。
三、如何建立一個數組
在咱們知道了如何聲明數組以後,接下來就是咱們如何建立一個數組。不一樣的語言建立一個數組的方式仍是不同的,可是大致上同樣,這裏給出java的幾種方式。
//第一種:int [] students = new int[50];//第二種String [] colors = {"red","blue","black"};//第三種:int [] height = new int [3] {170,175,169};
從上面能夠發現建立一個數組如此簡單,別急,這三種方式裏面其實仍是有不少知識點須要掌握的。其實數組的建立其中有一個環節叫作數組的初始化。舉個例子,我建立了一個數組,可是一開始數組容器裏面可能尚未這些值。那何時纔有了這些值呢?也就是系統何時把我聲明的那些red、blue等等裝到數組容器裏面的呢?這個過程就是數組的初始化。數組是如何初始化的呢?
數組的初始化分爲靜態初始化、動態初始化:
- 靜態初始化:數組在初始化時由程序員顯式指定每一個數組元素的初始值。而數組長度由系統決定。在上面建立數組的那三種方式中,第三種就是靜態初始化。第二種也是,可是屬於靜態初始化的簡化方式。
- 動態初始化:動態初始化時則必須指定元素個數。動態初始化時數組元素個數未知所以必須指定。上面第一種就是。
四、數組的分類
可能看到這個標題有一個疑問,數組還有分類嗎?不就是把相同類型的元素放在一塊兒嘛。其實否則。下面給你好好的分一下類:
按照是否有序分:有序數組和無序數組。
按照數組可否擴容分:靜態數組和動態數組。
先來看靜態數組:在編譯期間在棧中分配好內存的數組,在運行期間不能改變存儲空間,運行後由系統自動釋放。
再來看動態數組:動態數組,是相對於靜態數組而言。靜態數組的長度是預先定義好的,在整個程序中,一旦給定大小後就沒法改變。而動態數組則否則,它能夠隨程序須要而從新指定大小。動態數組的內存空間是從堆(heap)上分配(即動態分配)的。是經過執行代碼而爲其分配存儲空間。當程序執行到這些語句時,才爲其分配。程序員本身負責釋放內存。
java中動態數組的原理
現有一個數組:int [] data = new int[5];
該數組已經沒法繼續添加元素了,因此咱們再初始化一個新的數組,其容量爲10,即數組arr容量的2倍: int [] newData = new int [10];
而後將原數組的全部元素所有都賦值給新的數組。
再將原數組的引用 arr指向 新的數組。
靜態數組和動態數組的比較:
對於靜態數組,其建立很是方便,使用完也無需釋放,要引用也簡單,可是建立後沒法改變其大小是其致命弱點! 對於動態數組,其建立麻煩,使用完必須由程序員本身釋放,不然嚴重會引發內存泄露。但其使用很是靈活,能根據程序須要動態分配大小。
2、數組的特色
在上面掌握了其基本概念以後,再來看一下數組有什麼特色,數組的特色也是根據其分類來的,好比說有序數組其特色確定就是有序,咱們方便查找數據,無序的咱們方面插入刪除數據這些。因此這裏講的特色是全部數組共有的特色,也就是通常性特色:又回到了以前發過的文章,特色就是來看時間效率和空間效率的。
1.數組的長度固定的,超過長度時,只能建立一個新的數組,並把舊的數組的值傳進去方可;
2.數組的存儲類型是單一的,同一數組只能存儲同一數據類型的數據。
3.數組只能經過下標來訪問數據
3、數組的使用場景
數組較容器,最大的優勢就是效率。在Java中,數組是一種效率最高的存儲和隨機訪問對象引用序列的方式,數組就是一個簡單的線性序列,這使得元素訪問很是快速, 數組的優勢是效率高,但爲此,所付出的代價就是數組對象的大小被固定。這也使得在工做中,數組並不實用。咱們應該優選java中的容器,而不是數組。
4、數組的底層實現
這裏的底層實現也是相比較於java語言來講的,好比在之後的文章裏面,像鏈表這樣的數據結構我也會配合Java中鏈表實現的容器來配合着說。
Java提供了很棒的集合API和集合類如:ArrayList、HashMap,他們內部都是基於數組。java若是程序嘗試訪問無效的數組索引的話jvm會拋出ArrayIndexOutOfBoundException。
Java語言中,數組的實現原理是什麼?這個涉及到編譯原理的問題,我只能說,這是一個編譯規範。在規範中好比:int[]中的int告訴計算機這是一個整型數據,[]告訴計算機這是一個連續存儲的內存地址空間,簡單點說一個連續數據的存儲空間就是數組,數組只是一個名稱!!數組在Java裏是一種特殊類型,有別於普通的「類的實例」的對象。 以HotSpot VM爲例,答案是在數組對象的對象頭裏有一個_length字段,記錄數組長度。arraylength字節碼的實現只要去讀那個_length字段便可。JVM 中數組對象是一種特殊的對象,它的Object Header 比普通對象多了一個word 來存儲數組的長度,length 會編譯成對應的字節碼讀取這個field 就能夠了。
**下面看看在內存中是如何實現的!**
定義一個整型數組,並初始化 int p = new int[5]; 則:
好了數組就先介紹到這裏,後續內容我會持續的發佈出來