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