根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/m0_37609579/article/details/99355842
從這一節(jié)開(kāi)始,我們就要正式進(jìn)去數(shù)據(jù)結(jié)構(gòu)的世界了,那么第一個(gè)是什么呢,就是我們的數(shù)組。
在我想寫(xiě)數(shù)組的時(shí)候,我的第一印象是去看它的源碼,很可惜,數(shù)組的實(shí)現(xiàn)太特殊了,找了很久,我沒(méi)有找到它的源碼,帶著這樣的思考,我就開(kāi)始了Java中數(shù)組的挖掘。Wow,真香!
一、Java中數(shù)組的介紹
數(shù)組是一種最簡(jiǎn)單的復(fù)合數(shù)據(jù)類(lèi)型,它是有序數(shù)據(jù)的集合,數(shù)組中的每個(gè)元素具有相同的數(shù)據(jù)類(lèi)型,可以用一個(gè)統(tǒng)一的數(shù)組名和不同的下標(biāo)來(lái)唯一確定數(shù)組中的元素。根據(jù)數(shù)組的維度,可以將其分為一維數(shù)組、二維數(shù)組和多維數(shù)組等。一定要注意,數(shù)組只能存放同一種數(shù)據(jù)類(lèi)型(Object類(lèi)型數(shù)組除外)。
二、數(shù)組是一個(gè)引用類(lèi)型嗎?
先給答案,是的,沒(méi)有任何疑問(wèn)。
注意,數(shù)組也是一種數(shù)據(jù)類(lèi)型,它本身是一種引用類(lèi)型。
數(shù)組是一種大小固定的數(shù)據(jù)結(jié)構(gòu),對(duì)線性表的所有操作都可以通過(guò)數(shù)組來(lái)實(shí)現(xiàn)。雖然數(shù)組一旦創(chuàng)建之后,它的大小就無(wú)法改變了,但是當(dāng)數(shù)組不能再存儲(chǔ)線性表中的新元素時(shí),我們可以創(chuàng)建一個(gè)新的大的數(shù)組來(lái)替換當(dāng)前數(shù)組。這樣就可以使用數(shù)組實(shí)現(xiàn)動(dòng)態(tài)的數(shù)據(jù)結(jié)構(gòu)。
如何驗(yàn)證?
定義一個(gè)數(shù)組,發(fā)現(xiàn)它擁有Object類(lèi)的所有方法。
根據(jù)這個(gè)例子,其實(shí)大家已經(jīng)看出來(lái)了,數(shù)組擁有超類(lèi)Object的所有方法,說(shuō)明他也是一個(gè)類(lèi)。并且他擁有自己的clone()方法和length屬性。
三、如何了解數(shù)組的底層實(shí)現(xiàn)
既然數(shù)組擁有Object的所有方法,那我們是否能查看一下數(shù)組的源碼,來(lái)了解一下數(shù)組的實(shí)現(xiàn)呢?
可惜,數(shù)組太特殊了,他的實(shí)現(xiàn)是虛擬機(jī)編譯的時(shí)候動(dòng)態(tài)生成的,所以我們無(wú)法直接查看源碼,只能通過(guò)查看編譯后的class的字節(jié)碼一探究竟。
JVM 中數(shù)組對(duì)象是一種特殊的對(duì)象,虛擬機(jī)從數(shù)組的元數(shù)據(jù)中無(wú)法確認(rèn)數(shù)組的大小,它的Object Header 比普通對(duì)象多了一個(gè)word 來(lái)存儲(chǔ)數(shù)組的長(zhǎng)度,length 會(huì)編譯成對(duì)應(yīng)的字節(jié)碼讀取這個(gè)field 就可以了。
我分別定義基本數(shù)據(jù)類(lèi)型和引用類(lèi)型來(lái)查看一下最終生成的字節(jié)碼有何區(qū)別。
注意:定義并初始化一個(gè)數(shù)組后,在內(nèi)存中分配了兩個(gè)空間,一個(gè)用于存放數(shù)組的引用變量,另一個(gè)用于存放數(shù)組本身。
進(jìn)行程序開(kāi)發(fā)時(shí),要深入底層的運(yùn)行機(jī)制。
看待一個(gè)數(shù)組時(shí),一定要把數(shù)組看成兩個(gè)部分:一部分是數(shù)組引用,也就是在代碼中定義的數(shù)組引用變量;還有一部分是實(shí)際的數(shù)組對(duì)象,這部分是在對(duì)內(nèi)存里運(yùn)行的,通常無(wú)法直接訪問(wèn)它,只能通過(guò)數(shù)組引用變量來(lái)訪問(wèn)。
四、Array 的 length 域相關(guān)
在很多的資料中都寫(xiě)了,Array中有類(lèi)似public final int length的成員變量。但是在《Java Language Specifications》10.1. Array Types中明確寫(xiě)了,length不是類(lèi)型的一部分;
- An array's length is not part of its type.
打印:20java.lang.NoSuchFieldException: length
可以看到length并不是Array的成員變量。
五、Java語(yǔ)言規(guī)范關(guān)于Array的定義
數(shù)組在Java里是一種特殊類(lèi)型,有別于普通的“類(lèi)的實(shí)例”的對(duì)象。
10.1. Array Types
10.8. Class Objects for Arrays
Every array has an associated Class object, shared with all other arrays with the same component type.Although an array type is not a class, the Class object of every array acts as if:
數(shù)組類(lèi)型是由JVM從元素類(lèi)型合成出來(lái)的。
10.7. Array Members
The members of an array type are all of the following:
從Java語(yǔ)言到Class文件,Java源碼編譯器會(huì)識(shí)別出對(duì)數(shù)組類(lèi)型的length字段的訪問(wèn),并生成對(duì)應(yīng)的字節(jié)碼。
以O(shè)penJDK8的javac為例:
jdk8u/jdk8u/langtools: 84eb51777733 src/share/classes/com/sun/tools/javac/jvm/Gen.java
六、數(shù)據(jù)應(yīng)用場(chǎng)景
這種數(shù)據(jù)結(jié)構(gòu)使用一段連續(xù)的空間來(lái)存貯元素,所以可以直接通過(guò)索引來(lái)獲取到某個(gè)元素,而且可以通過(guò)對(duì)元素的內(nèi)容進(jìn)行排序,然后使用二分法查找,從而提供查找效率。其適合的場(chǎng)合主要是:
七、數(shù)組總結(jié)
在看數(shù)組的時(shí)候,因?yàn)閏lass是動(dòng)態(tài)創(chuàng)建的,所以看了很久,但是根據(jù)數(shù)組的特性,基本可以認(rèn)為數(shù)組的域和方法,類(lèi)似于:
數(shù)組可以是一維數(shù)組、二維數(shù)組或多維數(shù)組。
- 數(shù)值數(shù)組元素的默認(rèn)值為 0,而引用元素的默認(rèn)值為 null。
- 交錯(cuò)數(shù)組是數(shù)組的數(shù)組,因此,它的元素是引用類(lèi)型,初始化為 null。交錯(cuò)數(shù)組元素的維度和大小可以不同。
- 數(shù)組的索引從 0 開(kāi)始,如果數(shù)組有 n 個(gè)元素,那么數(shù)組的索引是從 0 到(n-1)。
- 數(shù)組元素可以是任何類(lèi)型,包括數(shù)組類(lèi)型。
- 數(shù)組類(lèi)型是從抽象基類(lèi) Array 派生的引用類(lèi)型。
我的微信公眾號(hào):架構(gòu)真經(jīng)(id:gentoo666),分享Java干貨,高并發(fā)編程,熱門(mén)技術(shù)教程,微服務(wù)及分布式技術(shù),架構(gòu)設(shè)計(jì),區(qū)塊鏈技術(shù),人工智能,大數(shù)據(jù),Java面試題,以及前沿?zé)衢T(mén)資訊等。每日更新哦!
參考文章:
總結(jié)
以上是生活随笔為你收集整理的根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 客运段是干什么的
- 下一篇: 自定义条件查询_数据查询不止有vlook