Java千問:七個問題幫助初學者深刻理解Java數組

幾乎全部的高級語言當中,都提供了一種叫作」數組」的東西,Java語言固然也不例外。咱們經過數組能夠很方便的存儲和管理一組數據。由於在Java語言當中使用數組很是的方便,因此致使不少初學者忽略了對數組的深刻學習,本文就經過七個問題,來幫助初學者深刻理解一下Java語言的數組究竟是怎麼回事。程序員

1、數組是變量的簡單疊加嗎?

咱們在學習Java的時候,知道一個int類型的變量能夠存儲一個整數,而一個int類想的數組能夠存儲多個整數。因而不少人認爲數組只不過是變量的簡單疊加而已,無非是變量存1個數,數組存多個數。其實否則,Java語言是把數組看成一個「對象」來看待的。咱們來看下面的代碼算法

Java千問:七個問題幫助初學者深刻理解Java數組
咱們能夠看到,在代碼中聲明瞭int型變量a和int型數組b,b的長度爲1。a和b都只能存儲1個int型數據,彷佛它們之間沒什麼區別。可是請注意:a和b之間實際上是有本質區別的,a是一個基礎數據類型的變量,而b則是一個對象!正由於它是一個對象,因此咱們才能夠調用到它的getClass()方法。那麼緊接着小夥伴們會問:b既然是一個對象,那麼這個對象是什麼類型的呢?咱們能夠經過「b.getClass().getName()」得到它類型的名稱是」 [I」。讀者也能夠經過這種方式,得到其餘幾種基礎數據類型數組的類型名稱。最重要的是,咱們必須搞清楚:數組不是變量的簡單疊加!即使是基礎數據類型的數組,也是以對象的形式存在的。編程

2、爲何數組的下標是從0開始的?

同不少編程語言同樣,Java語言數組的下標也是從0開始的。不少初學者都不理解,爲何數組下標要從0而不是從1開始?這太不符合咱們的平常計數習慣了。爲了說清楚這個問題,咱們仍是先看一段代碼數組

Java千問:七個問題幫助初學者深刻理解Java數組
在這段代碼中,建立了一個長度爲5的數組並命名爲a。在程序實際運行的時候,會分配一組連續的空間,這組空間中能夠存儲5個int型數據。爲了可以準確的從這組空間的任意一個單元中找到數據,虛擬機必須可以對這組空間中任意一個單元作出識別。那麼如何識別每一個單元呢?虛擬機能夠把每一個單元都進行單獨的命名,這樣作固然可以達到目的,可是這麼作跟使用變量就沒什麼區別了,更體現不出這組數據是一個連續的總體。實際的狀況是:虛擬機給這組空間的第一個單元命名爲a,若是但願找到a自己,那麼就直接用a[0]來表示,其中方括號中的0表示偏移量。偏移量爲0,就表示找的就是a這個空間中的數據,而a[1]表示以a爲基準點,偏移1個單元,這樣就找到了數組中第2個元素,以此類推,想找到數組中第5個元素,就以a這個單元爲基準點,再偏移4個單元便可。所以咱們就能夠知道,數組的下標本質上並非數組元素的編號,而是以數組首元素爲基準點所偏移的量。這就是數組下標從0開始的緣由。安全

3、數組的長度爲何能夠用變量表示?

咱們仍是先來看一段代碼
Java千問:七個問題幫助初學者深刻理解Java數組
這段代碼中,在建立數組的時候,以變量表示了這個數組的長度,這種作法放到Java語言中彷佛很常見,可是若是使用C語言編程,在建立數組的時候,數組的長度必須是一個固定的值,不能用變量來表示。不少人彷佛對這個問題不覺得然,只是簡單的認爲這只是Java和C語言之間一點簡單的語法差異而已。
其實問題遠不是這麼簡單。這個簡單的語法差異其實體現出了Java與C語言之間編譯和運行機制本質的不一樣。變量是運行時才被賦值的,Java語言容許把數組的長度以變量的形式來表示,其背後的根本緣由就是容許數組一直等到」運行時」才把長度肯定下來。也就是說,程序員能夠在編碼的時候,不用規定數組的長度,等到程序實際運行的時候,根據實際須要去肯定數組的長度,這樣大大增長了程序的靈活性。編程語言

舉個例子:若是咱們編寫程序,要求用戶輸入幾個數字保存到數組中,而後進行排序,用戶輸入多少個數字不肯定。若是咱們用Java語言去完成這個程序,只要先讓用戶輸入他想對多少個數字進行排序,而後把數字的個數保存到一個變量中,接着以這個變量的值做爲長度建立數組就能夠。可是若是是用C語言來完成程序,那麼程序員必須在編寫代碼的時候就把數組的長度定下來,而不能等到程序運行的時候再去肯定。由於C語言不能動態的在運行時肯定數組的長度,必須在編譯階段就把長度肯定下來。可是程序員在編碼的時候並不肯定用戶要對多少數字完成排序,因而就只能以經驗推測,建立一個他認爲」足夠大」的數組來存放排序的數字。若是建立的數組太大,則浪費空間,若是數組過小,則沒法保存所有數字。ide

說了這麼多,重點其實就一句話:Java語言的數組能夠在」運行時」肯定長度!而且這個特色大大的增長了程序的靈活性。學習

4、Java數組的長度能夠爲0嗎?

這個問題很簡單,只要寫一段代碼就能夠獲得答案:能夠!關鍵問題來了:長度爲0的數組不能存數據,這種數組有什麼意義呢?前面說過,Java語言容許在程序運行過程當中動態肯定數組長度。那麼咱們就能夠設想這樣的一個場景:要求編碼查詢出考試總分在700分以上的學員,而且把他們的姓名存儲到一個字符串數組中。假如通過查詢以後,發現沒有成績在700分以上的學員,該如何表示這個查詢結果呢?若是查詢方法返回null來表示沒有查到符合條件的數據,會對後續程序帶來必定的風險,由於畢竟空對象可能會致使後面的處理代碼中拋出空指針異常。而用一個長度爲0的數組來表示查詢結果就安全多了,僅能體現出沒有查到符合條件的數據,又下降了拋出異常的風險。編碼

5、Java語言中的數組能夠擴大容量嗎?

答案是不能夠!由於數組一旦分配了空間以後,若是想在原來空間的基礎上擴大容量,就如同是擴張地盤,勢必會影響到內存中其餘數據的存儲,因此Java語言不容許數組擴大容量。網上有不少資料,講解了如何擴大數組的容量,並給出了實現代碼。若是你仔細去看這些代碼,你會發現,這些所謂擴大數組容量的算法,其實現過程都是新建立一個更大的數組,而後把原數組中的數據拷貝到新數組中,最終返回那個新建立的數組。所以這種所謂的擴容算法其實並非真正的擴容。指針

6、能夠建立抽象類數組嗎?

仍是看代碼

Java千問:七個問題幫助初學者深刻理解Java數組
代碼中建立了一個抽象類A,而且在main()方法中建立了一個A類型的數組。問題又來了:抽象類A不能建立對象,而如今不只建立了對象,而且仍是一組!這是怎麼回事?其實這也是不少初學者在理解引用類型數據數組的一個誤區:認爲數組中存放的某種類型的對象。其實否則,引用數據類型的數組中,存放的並非對象,而只是能指向這種對象的引用而已。就拿上面這段代碼來講,數組a中並無存放5個A類型的對象,而只是存放了5個可以指向A類型對象的引用,這些引用在數組初始化的過程當中,都指向空對象(null),因此千萬不要錯誤的認爲建立了某類型的數組,同時就建立了N個該類型的對象。代碼中,數組a中所存放的那些引用,未來所指向的一定也是A類子類的對象,由於A類自身根本就不能建立對象。

7、多維數組的length屬性值是多少?

看代碼

Java千問:七個問題幫助初學者深刻理解Java數組
以上代碼運行,輸出結果會是多少呢?一部分初學者會認爲輸出的結果是12,由於這個數組可以存儲12個數字。但程序實際運行輸出的結果倒是3,這是爲何呢?就是由於,不管數組自己的維度是多少,在Java虛擬機看來,這個數組都是一維數組!有小夥伴可能不解:a明明是一個二維數組,怎麼會被看成是一維數組呢?咱們能夠看下圖來幫助理解

咱們能夠看到,圖中是一個3行4列的二維數組。可是若是咱們把數組中的每一行看做是一個元素,那麼這個二維數組就能夠被理解爲一個一維數組,數組中包含3個元素,只不過每一個元素並非一個簡單的數字,而是一個一維數組。也就是說,這個二維數組能夠被理解爲」由3個一維數組組成的數組」。Java語言就是以這樣的方式來管理數組的,不管數組維度是多少,都被看成一維數組,若是數組中的元素又是數組(嚴格的表述應該是:數組元素是指向一維數組的引用),那麼就造成了多維數組。所以,剛纔在代碼中看到的那個二維數組a,它的length屬性值爲3而不是12。

但願經過這七個問題,可以幫助初學者深刻理解Java語言的數組。

若是但願系統學習Java編程,能夠觀看我在本站的視頻課程。有問題也能夠加入個人QQ羣291839907一塊兒討論!

相關文章
相關標籤/搜索