多个数字数组_七个问题帮助初学者深入理解Java数组
短文漲姿勢(shì),看了不白看,不關(guān)注等啥?
幾乎所有的高級(jí)語(yǔ)言當(dāng)中,都提供了一種叫做”數(shù)組”的東西,Java語(yǔ)言當(dāng)然也不例外。我們通過(guò)數(shù)組可以很方便的存儲(chǔ)和管理一組數(shù)據(jù)。因?yàn)樵贘ava語(yǔ)言當(dāng)中使用數(shù)組非常的方便,所以導(dǎo)致很多初學(xué)者忽略了對(duì)數(shù)組的深入學(xué)習(xí),本文就通過(guò)七個(gè)問(wèn)題,來(lái)幫助初學(xué)者深入理解一下Java語(yǔ)言的數(shù)組到底是怎么回事。
一、數(shù)組是變量的簡(jiǎn)單疊加嗎?
我們?cè)趯W(xué)習(xí)Java的時(shí)候,知道一個(gè)int類型的變量可以存儲(chǔ)一個(gè)整數(shù),而一個(gè)int類想的數(shù)組可以存儲(chǔ)多個(gè)整數(shù)。于是很多人認(rèn)為數(shù)組只不過(guò)是變量的簡(jiǎn)單疊加而已,無(wú)非是變量存1個(gè)數(shù),數(shù)組存多個(gè)數(shù)。其實(shí)不然,Java語(yǔ)言是把數(shù)組當(dāng)作一個(gè)“對(duì)象”來(lái)看待的。我們來(lái)看下面的代碼
我們可以看到,在代碼中聲明了int型變量a和int型數(shù)組b,b的長(zhǎng)度為1。a和b都只能存儲(chǔ)1個(gè)int型數(shù)據(jù),似乎它們之間沒(méi)什么區(qū)別。但是請(qǐng)注意:a和b之間其實(shí)是有本質(zhì)區(qū)別的,a是一個(gè)基礎(chǔ)數(shù)據(jù)類型的變量,而b則是一個(gè)對(duì)象!正因?yàn)樗且粋€(gè)對(duì)象,所以我們才可以調(diào)用到它的getClass()方法。那么緊接著小伙伴們會(huì)問(wèn):b既然是一個(gè)對(duì)象,那么這個(gè)對(duì)象是什么類型的呢?我們可以通過(guò)“b.getClass().getName()”獲得它類型的名稱是” [I”。讀者也可以通過(guò)這種方式,獲得其他幾種基礎(chǔ)數(shù)據(jù)類型數(shù)組的類型名稱。最重要的是,我們必須搞清楚:數(shù)組不是變量的簡(jiǎn)單疊加!即便是基礎(chǔ)數(shù)據(jù)類型的數(shù)組,也是以對(duì)象的形式存在的。
二、為什么數(shù)組的下標(biāo)是從0開始的?
同很多編程語(yǔ)言一樣,Java語(yǔ)言數(shù)組的下標(biāo)也是從0開始的。很多初學(xué)者都不理解,為什么數(shù)組下標(biāo)要從0而不是從1開始?這太不符合我們的日常計(jì)數(shù)習(xí)慣了。為了說(shuō)清楚這個(gè)問(wèn)題,我們還是先看一段代碼
在這段代碼中,創(chuàng)建了一個(gè)長(zhǎng)度為5的數(shù)組并命名為a。在程序?qū)嶋H運(yùn)行的時(shí)候,會(huì)分配一組連續(xù)的空間,這組空間中可以存儲(chǔ)5個(gè)int型數(shù)據(jù)。為了能夠準(zhǔn)確的從這組空間的任意一個(gè)單元中找到數(shù)據(jù),虛擬機(jī)必須能夠?qū)@組空間中任意一個(gè)單元做出識(shí)別。那么如何識(shí)別每個(gè)單元呢?虛擬機(jī)可以把每個(gè)單元都進(jìn)行單獨(dú)的命名,這樣做當(dāng)然能夠達(dá)到目的,但是這么做跟使用變量就沒(méi)什么區(qū)別了,更體現(xiàn)不出這組數(shù)據(jù)是一個(gè)連續(xù)的整體。實(shí)際的情況是:虛擬機(jī)給這組空間的第一個(gè)單元命名為a,如果希望找到a本身,那么就直接用a[0]來(lái)表示,其中方括號(hào)中的0表示偏移量。偏移量為0,就表示找的就是a這個(gè)空間中的數(shù)據(jù),而a[1]表示以a為基準(zhǔn)點(diǎn),偏移1個(gè)單元,這樣就找到了數(shù)組中第2個(gè)元素,以此類推,想找到數(shù)組中第5個(gè)元素,就以a這個(gè)單元為基準(zhǔn)點(diǎn),再偏移4個(gè)單元即可。因此我們就可以知道,數(shù)組的下標(biāo)本質(zhì)上并不是數(shù)組元素的編號(hào),而是以數(shù)組首元素為基準(zhǔn)點(diǎn)所偏移的量。這就是數(shù)組下標(biāo)從0開始的原因。
三、數(shù)組的長(zhǎng)度為什么可以用變量表示?
我們還是先來(lái)看一段代碼
這段代碼中,在創(chuàng)建數(shù)組的時(shí)候,以變量表示了這個(gè)數(shù)組的長(zhǎng)度,這種做法放到Java語(yǔ)言中似乎很常見,但是如果使用C語(yǔ)言編程,在創(chuàng)建數(shù)組的時(shí)候,數(shù)組的長(zhǎng)度必須是一個(gè)固定的值,不能用變量來(lái)表示。很多人似乎對(duì)這個(gè)問(wèn)題不以為然,只是簡(jiǎn)單的認(rèn)為這只是Java和C語(yǔ)言之間一點(diǎn)簡(jiǎn)單的語(yǔ)法差別而已。
其實(shí)問(wèn)題遠(yuǎn)不是這么簡(jiǎn)單。這個(gè)簡(jiǎn)單的語(yǔ)法差別其實(shí)體現(xiàn)出了Java與C語(yǔ)言之間編譯和運(yùn)行機(jī)制本質(zhì)的不同。變量是運(yùn)行時(shí)才被賦值的,Java語(yǔ)言允許把數(shù)組的長(zhǎng)度以變量的形式來(lái)表示,其背后的根本原因就是允許數(shù)組一直等到”運(yùn)行時(shí)”才把長(zhǎng)度確定下來(lái)。也就是說(shuō),程序員可以在編碼的時(shí)候,不用規(guī)定數(shù)組的長(zhǎng)度,等到程序?qū)嶋H運(yùn)行的時(shí)候,根據(jù)實(shí)際需要去確定數(shù)組的長(zhǎng)度,這樣大大增加了程序的靈活性。
舉個(gè)例子:如果我們編寫程序,要求用戶輸入幾個(gè)數(shù)字保存到數(shù)組中,然后進(jìn)行排序,用戶輸入多少個(gè)數(shù)字不確定。如果我們用Java語(yǔ)言去完成這個(gè)程序,只要先讓用戶輸入他想對(duì)多少個(gè)數(shù)字進(jìn)行排序,然后把數(shù)字的個(gè)數(shù)保存到一個(gè)變量中,接著以這個(gè)變量的值作為長(zhǎng)度創(chuàng)建數(shù)組就可以。但是如果是用C語(yǔ)言來(lái)完成程序,那么程序員必須在編寫代碼的時(shí)候就把數(shù)組的長(zhǎng)度定下來(lái),而不能等到程序運(yùn)行的時(shí)候再去確定。因?yàn)镃語(yǔ)言不能動(dòng)態(tài)的在運(yùn)行時(shí)確定數(shù)組的長(zhǎng)度,必須在編譯階段就把長(zhǎng)度確定下來(lái)。但是程序員在編碼的時(shí)候并不確定用戶要對(duì)多少數(shù)字完成排序,于是就只能以經(jīng)驗(yàn)推測(cè),創(chuàng)建一個(gè)他認(rèn)為”足夠大”的數(shù)組來(lái)存放排序的數(shù)字。如果創(chuàng)建的數(shù)組太大,則浪費(fèi)空間,如果數(shù)組太小,則無(wú)法保存全部數(shù)字。
說(shuō)了這么多,重點(diǎn)其實(shí)就一句話:Java語(yǔ)言的數(shù)組可以在”運(yùn)行時(shí)”確定長(zhǎng)度!并且這個(gè)特點(diǎn)大大的增加了程序的靈活性。
四、Java數(shù)組的長(zhǎng)度可以為0嗎?
這個(gè)問(wèn)題很簡(jiǎn)單,只要寫一段代碼就可以得到答案:可以!關(guān)鍵問(wèn)題來(lái)了:長(zhǎng)度為0的數(shù)組不能存數(shù)據(jù),這種數(shù)組有什么意義呢?前面說(shuō)過(guò),Java語(yǔ)言允許在程序運(yùn)行過(guò)程中動(dòng)態(tài)確定數(shù)組長(zhǎng)度。那么我們就可以設(shè)想這樣的一個(gè)場(chǎng)景:要求編碼查詢出考試總分在700分以上的學(xué)員,并且把他們的姓名存儲(chǔ)到一個(gè)字符串?dāng)?shù)組中。假如經(jīng)過(guò)查詢之后,發(fā)現(xiàn)沒(méi)有成績(jī)?cè)?00分以上的學(xué)員,該如何表示這個(gè)查詢結(jié)果呢?如果查詢方法返回null來(lái)表示沒(méi)有查到符合條件的數(shù)據(jù),會(huì)對(duì)后續(xù)程序帶來(lái)一定的風(fēng)險(xiǎn),因?yàn)楫吘箍諏?duì)象可能會(huì)導(dǎo)致后面的處理代碼中拋出空指針異常。而用一個(gè)長(zhǎng)度為0的數(shù)組來(lái)表示查詢結(jié)果就安全多了,僅能體現(xiàn)出沒(méi)有查到符合條件的數(shù)據(jù),又降低了拋出異常的風(fēng)險(xiǎn)。
五、Java語(yǔ)言中的數(shù)組可以擴(kuò)大容量嗎?
答案是不可以!因?yàn)閿?shù)組一旦分配了空間之后,如果想在原來(lái)空間的基礎(chǔ)上擴(kuò)大容量,就如同是擴(kuò)張地盤,勢(shì)必會(huì)影響到內(nèi)存中其他數(shù)據(jù)的存儲(chǔ),所以Java語(yǔ)言不允許數(shù)組擴(kuò)大容量。網(wǎng)上有很多資料,講解了如何擴(kuò)大數(shù)組的容量,并給出了實(shí)現(xiàn)代碼。如果你仔細(xì)去看這些代碼,你會(huì)發(fā)現(xiàn),這些所謂擴(kuò)大數(shù)組容量的算法,其實(shí)現(xiàn)過(guò)程都是新創(chuàng)建一個(gè)更大的數(shù)組,然后把原數(shù)組中的數(shù)據(jù)拷貝到新數(shù)組中,最終返回那個(gè)新創(chuàng)建的數(shù)組。因此這種所謂的擴(kuò)容算法其實(shí)并不是真正的擴(kuò)容。
六、可以創(chuàng)建抽象類數(shù)組嗎?
還是看代碼
代碼中創(chuàng)建了一個(gè)抽象類A,并且在main()方法中創(chuàng)建了一個(gè)A類型的數(shù)組。問(wèn)題又來(lái)了:抽象類A不能創(chuàng)建對(duì)象,而現(xiàn)在不僅創(chuàng)建了對(duì)象,并且還是一組!這是怎么回事?其實(shí)這也是很多初學(xué)者在理解引用類型數(shù)據(jù)數(shù)組的一個(gè)誤區(qū):認(rèn)為數(shù)組中存放的某種類型的對(duì)象。其實(shí)不然,引用數(shù)據(jù)類型的數(shù)組中,存放的并不是對(duì)象,而只是能指向這種對(duì)象的引用而已。就拿上面這段代碼來(lái)說(shuō),數(shù)組a中并沒(méi)有存放5個(gè)A類型的對(duì)象,而只是存放了5個(gè)能夠指向A類型對(duì)象的引用,這些引用在數(shù)組初始化的過(guò)程中,都指向空對(duì)象(null),所以千萬(wàn)不要錯(cuò)誤的認(rèn)為創(chuàng)建了某類型的數(shù)組,同時(shí)就創(chuàng)建了N個(gè)該類型的對(duì)象。代碼中,數(shù)組a中所存放的那些引用,將來(lái)所指向的必定也是A類子類的對(duì)象,因?yàn)锳類自身根本就不能創(chuàng)建對(duì)象。
七、多維數(shù)組的length屬性值是多少?
看代碼
以上代碼運(yùn)行,輸出結(jié)果會(huì)是多少呢?一部分初學(xué)者會(huì)認(rèn)為輸出的結(jié)果是12,因?yàn)檫@個(gè)數(shù)組能夠存儲(chǔ)12個(gè)數(shù)字。但程序?qū)嶋H運(yùn)行輸出的結(jié)果卻是3,這是為什么呢?就是因?yàn)?#xff0c;無(wú)論數(shù)組本身的維度是多少,在Java虛擬機(jī)看來(lái),這個(gè)數(shù)組都是一維數(shù)組!有小伙伴可能不解:a明明是一個(gè)二維數(shù)組,怎么會(huì)被當(dāng)作是一維數(shù)組呢?我們可以看下圖來(lái)幫助理解
我們可以看到,圖中是一個(gè)3行4列的二維數(shù)組。但是如果我們把數(shù)組中的每一行看作是一個(gè)元素,那么這個(gè)二維數(shù)組就可以被理解為一個(gè)一維數(shù)組,數(shù)組中包含3個(gè)元素,只不過(guò)每個(gè)元素并不是一個(gè)簡(jiǎn)單的數(shù)字,而是一個(gè)一維數(shù)組。也就是說(shuō),這個(gè)二維數(shù)組可以被理解為”由3個(gè)一維數(shù)組組成的數(shù)組”。Java語(yǔ)言就是以這樣的方式來(lái)管理數(shù)組的,無(wú)論數(shù)組維度是多少,都被當(dāng)作一維數(shù)組,如果數(shù)組中的元素又是數(shù)組(嚴(yán)格的表述應(yīng)該是:數(shù)組元素是指向一維數(shù)組的引用),那么就形成了多維數(shù)組。因此,剛才在代碼中看到的那個(gè)二維數(shù)組a,它的length屬性值為3而不是12。
希望通過(guò)這七個(gè)問(wèn)題,能夠幫助初學(xué)者深入理解Java語(yǔ)言的數(shù)組。
看短文,漲姿勢(shì),如想系統(tǒng)學(xué)習(xí)Java編程,點(diǎn)擊下方的“了解更多”即可,不讓你進(jìn)去,用QQ登錄就可以啦!有問(wèn)題也可以加入我的QQ群一起討論!
總結(jié)
以上是生活随笔為你收集整理的多个数字数组_七个问题帮助初学者深入理解Java数组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 平面设计培训班多少钱啊?
- 下一篇: java concurrent 例子_[