溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中動態(tài)數組的原理是什么

發(fā)布時間:2022-03-22 15:46:29 來源:億速云 閱讀:197 作者:iii 欄目:大數據

本文小編為大家詳細介紹“java中動態(tài)數組的原理是什么”,內容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“java中動態(tài)數組的原理是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

一、數組的基本概念

1、什么是數組?

在平時使用最多的恐怕就是數組了吧,

它是使用最廣泛的一種數據結構,它是相同數據類型(可以是基本類型也可以是自定義類型)的元素按一定順序排列的集合,它們在內存中按照這個先后順序連續(xù)存放在一起。有一維數組,二維數組,多維數組。

通俗的理解就是我們一般把一群羊或者一群牛放在一個圈里面,這個圈就相當于數組容器,每一個羊相當于一個元素。

以上這個概念需要知道這幾個詞匯:相同數據類型、一定順序排列、集合、內存先后存放。

2、如何聲明一個數組

從標題就可以看到,聲明和創(chuàng)建一個數組是兩個不同的過程。聲明的作用就好像是告訴別人我要去洗澡,創(chuàng)建的作用就好像是我真正的去洗澡了(比喻不當哈哈)。那如何聲明數組呢?

int[] students ; int students [];

從上面我們看到這里有兩種方式,但一般推薦第一種。畢竟第一種看起來可讀性更好一點。

3、如何創(chuàng)建一個數組

在我們知道了如何聲明數組之后,接下來就是我們如何創(chuàng)建一個數組。不同的語言創(chuàng)建一個數組的方式還是不一樣的,但是大體上一樣,這里給出java的幾種方式。

//第一種: int [] students = new  int[50]; //第二種: String [] colors =  {"red","blue","black"};

從上面可以發(fā)現創(chuàng)建一個數組如此簡單,別急,這三種方式里面其實還是有很多知識點需要掌握的。其實數組的創(chuàng)建其中有一個環(huán)節(jié)叫做數組的初始化。舉個例子,我創(chuàng)建了一個數組,但是一開始數組容器里面可能還沒有這些值。那什么時候才有了這些值呢?也就是系統(tǒng)什么時候把我聲明的那些red、blue等等裝到數組容器里面的呢?這個過程就是數組的初始化。數組是如何初始化的呢?

數組的初始化分為靜態(tài)初始化、動態(tài)初始化:

  • 靜態(tài)初始化:數組在初始化時由程序員顯式指定每個數組元素的初始值。而數組長度由系統(tǒng)決定。在上面創(chuàng)建數組的那三種方式中,第三種就是靜態(tài)初始化。第二種也是,但是屬于靜態(tài)初始化的簡化方式。

  • 動態(tài)初始化:動態(tài)初始化時則必須指定元素個數。動態(tài)初始化時數組元素個數未知因此必須指定。上面第一種就是。

4、數組的分類

可能看到這個標題有一個疑問,數組還有分類嗎?不就是把相同類型的元素放在一起嘛。其實不然。下面給你好好的分一下類:

**按照是否有序分:**有序數組和無序數組。

按照數組能否擴容分:靜態(tài)數組和動態(tài)數組。

先來看靜態(tài)數組:在編譯期間在棧中分配好內存的數組,在運行期間不能改變存儲空間,運行后由系統(tǒng)自動釋放。

再來看動態(tài)數組:動態(tài)數組,是相對于靜態(tài)數組而言。靜態(tài)數組的長度是預先定義好的,在整個程序中,一旦給定大小后就無法改變。而動態(tài)數組則不然,它可以隨程序需要而重新指定大小。動態(tài)數組的內存空間是從堆(heap)上分配(即動態(tài)分配)的。是通過執(zhí)行代碼而為其分配存儲空間。當程序執(zhí)行到這些語句時,才為其分配。程序員自己負責釋放內存。

java中動態(tài)數組的原理

現有一個數組:

int [] data = new int[5];

java中動態(tài)數組的原理是什么

該數組已經無法繼續(xù)添加元素了,所以我們再初始化一個新的數組,其容量為10,即數組arr容量的2倍:int [] newData = new int  [10];

java中動態(tài)數組的原理是什么

然后將原數組的所有元素全部都賦值給新的數組。

java中動態(tài)數組的原理是什么

再將原數組的引用 arr指向 新的數組。

java中動態(tài)數組的原理是什么

靜態(tài)數組和動態(tài)數組的比較:

對于靜態(tài)數組,其創(chuàng)建非常方便,使用完也無需釋放,要引用也簡單,但是創(chuàng)建后無法改變其大小是其致命弱點!對于動態(tài)數組,其創(chuàng)建麻煩,使用完必須由程序員自己釋放,否則嚴重會引起內存泄露。但其使用非常靈活,能根據程序需要動態(tài)分配大小。

二、數組的特點

在上面掌握了其基本概念之后,再來看一下數組有什么特點,數組的特點也是根據其分類來的,比如說有序數組其特點肯定就是有序,我們方便查找數據,無序的我們方面插入刪除數據這些。所以這里講的特點是所有數組共有的特點,也就是一般性特點:又回到了之前發(fā)過的文章,特點就是來看時間效率和空間效率的。

1.數組的長度固定的,超過長度時,只能創(chuàng)建一個新的數組,并把舊的數組的值傳進去方可;

2.數組的存儲類型是單一的,同一數組只能存儲同一數據類型的數據。

3.數組只能通過下標來訪問數據

三、數組的使用場景

數組較容器,最大的優(yōu)點就是效率。在Java中,數組是一種效率最高的存儲和隨機訪問對象引用序列的方式,數組就是一個簡單的線性序列,這使得元素訪問非??焖?,  數組的優(yōu)點是效率高,但為此,所付出的代價就是數組對象的大小被固定。這也使得在工作中,數組并不實用。我們應該優(yōu)選java中的容器,而不是數組。

四、數組的底層實現

這里的底層實現也是相比較于java語言來說的,比如在以后的文章里面,像鏈表這樣的數據結構我也會配合Java中鏈表實現的容器來配合著說。

Java提供了很棒的集合API和集合類如:ArrayList、HashMap,他們內部都是基于數組。java如果程序嘗試訪問無效的數組索引的話jvm會拋出ArrayIndexOutOfBoundException。

Java語言中,數組的實現原理是什么?

這個涉及到編譯原理的問題,我只能說,這是一個編譯規(guī)范。在規(guī)范中比如:int[]中的int告訴計算機這是一個整型數據,[]告訴計算機這是一個連續(xù)存儲的內存地址空間,簡單點說一個連續(xù)數據的存儲空間就是數組,數組只是一個名稱!!數組在Java里是一種特殊類型,有別于普通的“類的實例”的對象。

以HotSpot  VM為例,答案是在數組對象的對象頭里有一個length字段,記錄數組長度。arraylength字節(jié)碼的實現只要去讀那個_length字段即可。JVM  中數組對象是一種特殊的對象,它的Object Header 比普通對象多了一個word 來存儲數組的長度,length 會編譯成對應的字節(jié)碼讀取這個field  就可以了。

讀到這里,這篇“java中動態(tài)數組的原理是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI