您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“java中動態數組的原理是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“java中動態數組的原理是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
一、數組的基本概念
1、什么是數組?
在平時使用最多的恐怕就是數組了吧,
它是使用最廣泛的一種數據結構,它是相同數據類型(可以是基本類型也可以是自定義類型)的元素按一定順序排列的集合,它們在內存中按照這個先后順序連續存放在一起。有一維數組,二維數組,多維數組。
通俗的理解就是我們一般把一群羊或者一群牛放在一個圈里面,這個圈就相當于數組容器,每一個羊相當于一個元素。
以上這個概念需要知道這幾個詞匯:相同數據類型、一定順序排列、集合、內存先后存放。
2、如何聲明一個數組
從標題就可以看到,聲明和創建一個數組是兩個不同的過程。聲明的作用就好像是告訴別人我要去洗澡,創建的作用就好像是我真正的去洗澡了(比喻不當哈哈)。那如何聲明數組呢?
int[] students ; int students [];
從上面我們看到這里有兩種方式,但一般推薦第一種。畢竟第一種看起來可讀性更好一點。
3、如何創建一個數組
在我們知道了如何聲明數組之后,接下來就是我們如何創建一個數組。不同的語言創建一個數組的方式還是不一樣的,但是大體上一樣,這里給出java的幾種方式。
//第一種: int [] students = new int[50]; //第二種: String [] colors = {"red","blue","black"};
從上面可以發現創建一個數組如此簡單,別急,這三種方式里面其實還是有很多知識點需要掌握的。其實數組的創建其中有一個環節叫做數組的初始化。舉個例子,我創建了一個數組,但是一開始數組容器里面可能還沒有這些值。那什么時候才有了這些值呢?也就是系統什么時候把我聲明的那些red、blue等等裝到數組容器里面的呢?這個過程就是數組的初始化。數組是如何初始化的呢?
數組的初始化分為靜態初始化、動態初始化:
靜態初始化:數組在初始化時由程序員顯式指定每個數組元素的初始值。而數組長度由系統決定。在上面創建數組的那三種方式中,第三種就是靜態初始化。第二種也是,但是屬于靜態初始化的簡化方式。
動態初始化:動態初始化時則必須指定元素個數。動態初始化時數組元素個數未知因此必須指定。上面第一種就是。
4、數組的分類
可能看到這個標題有一個疑問,數組還有分類嗎?不就是把相同類型的元素放在一起嘛。其實不然。下面給你好好的分一下類:
**按照是否有序分:**有序數組和無序數組。
按照數組能否擴容分:靜態數組和動態數組。
先來看靜態數組:在編譯期間在棧中分配好內存的數組,在運行期間不能改變存儲空間,運行后由系統自動釋放。
再來看動態數組:動態數組,是相對于靜態數組而言。靜態數組的長度是預先定義好的,在整個程序中,一旦給定大小后就無法改變。而動態數組則不然,它可以隨程序需要而重新指定大小。動態數組的內存空間是從堆(heap)上分配(即動態分配)的。是通過執行代碼而為其分配存儲空間。當程序執行到這些語句時,才為其分配。程序員自己負責釋放內存。
java中動態數組的原理
現有一個數組:
int [] data = new int[5];
該數組已經無法繼續添加元素了,所以我們再初始化一個新的數組,其容量為10,即數組arr容量的2倍:int [] newData = new int [10];
然后將原數組的所有元素全部都賦值給新的數組。
再將原數組的引用 arr指向 新的數組。
靜態數組和動態數組的比較:
對于靜態數組,其創建非常方便,使用完也無需釋放,要引用也簡單,但是創建后無法改變其大小是其致命弱點!對于動態數組,其創建麻煩,使用完必須由程序員自己釋放,否則嚴重會引起內存泄露。但其使用非常靈活,能根據程序需要動態分配大小。
二、數組的特點
在上面掌握了其基本概念之后,再來看一下數組有什么特點,數組的特點也是根據其分類來的,比如說有序數組其特點肯定就是有序,我們方便查找數據,無序的我們方面插入刪除數據這些。所以這里講的特點是所有數組共有的特點,也就是一般性特點:又回到了之前發過的文章,特點就是來看時間效率和空間效率的。
1.數組的長度固定的,超過長度時,只能創建一個新的數組,并把舊的數組的值傳進去方可;
2.數組的存儲類型是單一的,同一數組只能存儲同一數據類型的數據。
3.數組只能通過下標來訪問數據
三、數組的使用場景
數組較容器,最大的優點就是效率。在Java中,數組是一種效率最高的存儲和隨機訪問對象引用序列的方式,數組就是一個簡單的線性序列,這使得元素訪問非常快速, 數組的優點是效率高,但為此,所付出的代價就是數組對象的大小被固定。這也使得在工作中,數組并不實用。我們應該優選java中的容器,而不是數組。
四、數組的底層實現
這里的底層實現也是相比較于java語言來說的,比如在以后的文章里面,像鏈表這樣的數據結構我也會配合Java中鏈表實現的容器來配合著說。
Java提供了很棒的集合API和集合類如:ArrayList、HashMap,他們內部都是基于數組。java如果程序嘗試訪問無效的數組索引的話jvm會拋出ArrayIndexOutOfBoundException。
Java語言中,數組的實現原理是什么?
這個涉及到編譯原理的問題,我只能說,這是一個編譯規范。在規范中比如:int[]中的int告訴計算機這是一個整型數據,[]告訴計算機這是一個連續存儲的內存地址空間,簡單點說一個連續數據的存儲空間就是數組,數組只是一個名稱!!數組在Java里是一種特殊類型,有別于普通的“類的實例”的對象。
以HotSpot VM為例,答案是在數組對象的對象頭里有一個length字段,記錄數組長度。arraylength字節碼的實現只要去讀那個_length字段即可。JVM 中數組對象是一種特殊的對象,它的Object Header 比普通對象多了一個word 來存儲數組的長度,length 會編譯成對應的字節碼讀取這個field 就可以了。
讀到這里,這篇“java中動態數組的原理是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。