日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组

發(fā)布時間:2023/12/2 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/m0_37609579/article/details/99355842
從這一節(jié)開始,我們就要正式進去數(shù)據(jù)結(jié)構(gòu)的世界了,那么第一個是什么呢,就是我們的數(shù)組。
在我想寫數(shù)組的時候,我的第一印象是去看它的源碼,很可惜,數(shù)組的實現(xiàn)太特殊了,找了很久,我沒有找到它的源碼,帶著這樣的思考,我就開始了Java中數(shù)組的挖掘。Wow,真香!
一、Java中數(shù)組的介紹
數(shù)組是一種最簡單的復(fù)合數(shù)據(jù)類型,它是有序數(shù)據(jù)的集合,數(shù)組中的每個元素具有相同的數(shù)據(jù)類型,可以用一個統(tǒng)一的數(shù)組名和不同的下標(biāo)來唯一確定數(shù)組中的元素。根據(jù)數(shù)組的維度,可以將其分為一維數(shù)組、二維數(shù)組和多維數(shù)組等。一定要注意,數(shù)組只能存放同一種數(shù)據(jù)類型(Object類型數(shù)組除外)。
二、數(shù)組是一個引用類型嗎?
先給答案,是的,沒有任何疑問。
注意,數(shù)組也是一種數(shù)據(jù)類型,它本身是一種引用類型。
數(shù)組是一種大小固定的數(shù)據(jù)結(jié)構(gòu),對線性表的所有操作都可以通過數(shù)組來實現(xiàn)。雖然數(shù)組一旦創(chuàng)建之后,它的大小就無法改變了,但是當(dāng)數(shù)組不能再存儲線性表中的新元素時,我們可以創(chuàng)建一個新的大的數(shù)組來替換當(dāng)前數(shù)組。這樣就可以使用數(shù)組實現(xiàn)動態(tài)的數(shù)據(jù)結(jié)構(gòu)。
如何驗證?
定義一個數(shù)組,發(fā)現(xiàn)它擁有Object類的所有方法。


根據(jù)這個例子,其實大家已經(jīng)看出來了,數(shù)組擁有超類Object的所有方法,說明他也是一個類。并且他擁有自己的clone()方法和length屬性。
三、如何了解數(shù)組的底層實現(xiàn)
既然數(shù)組擁有Object的所有方法,那我們是否能查看一下數(shù)組的源碼,來了解一下數(shù)組的實現(xiàn)呢?
可惜,數(shù)組太特殊了,他的實現(xiàn)是虛擬機編譯的時候動態(tài)生成的,所以我們無法直接查看源碼,只能通過查看編譯后的class的字節(jié)碼一探究竟。
JVM 中數(shù)組對象是一種特殊的對象,虛擬機從數(shù)組的元數(shù)據(jù)中無法確認(rèn)數(shù)組的大小,它的Object Header 比普通對象多了一個word 來存儲數(shù)組的長度,length 會編譯成對應(yīng)的字節(jié)碼讀取這個field 就可以了。
我分別定義基本數(shù)據(jù)類型和引用類型來查看一下最終生成的字節(jié)碼有何區(qū)別。

public void test08(){Object[] o = new String[11];o[0]="1aaa";int i=o.length;Integer[] a=new Integer[11];a[0]=100;int j=a.length;int[] b=new int[11];b[0]=100;int k=b.length;}

注意:定義并初始化一個數(shù)組后,在內(nèi)存中分配了兩個空間,一個用于存放數(shù)組的引用變量,另一個用于存放數(shù)組本身。


進行程序開發(fā)時,要深入底層的運行機制。
看待一個數(shù)組時,一定要把數(shù)組看成兩個部分:一部分是數(shù)組引用,也就是在代碼中定義的數(shù)組引用變量;還有一部分是實際的數(shù)組對象,這部分是在對內(nèi)存里運行的,通常無法直接訪問它,只能通過數(shù)組引用變量來訪問。


四、Array 的 length 域相關(guān)
在很多的資料中都寫了,Array中有類似public final int length的成員變量。但是在《Java Language Specifications》10.1. Array Types中明確寫了,length不是類型的一部分;

  • An array's length is not part of its type.
0 bipush 112 anewarray #12 <java/lang/String> //anewarray代表對象數(shù)組5 astore_16 aload_17 iconst_08 ldc #25 <1aaa> 10 aastore 11 aload_1 12 arraylength //arraylength代表長度 13 istore_2 14 bipush 11 16 anewarray #26 <java/lang/Integer> //anewarray代表包裝類數(shù)組 19 astore_3 20 aload_3 21 iconst_0 22 bipush 100 24 invokestatic #27 <java/lang/Integer.valueOf> 27 aastore 28 aload_3 29 arraylength 30 istore 4 32 bipush 11 34 newarray 10 (int) //newarray代表基本數(shù)組類型數(shù)組 36 astore 5 38 aload 5 40 iconst_0 41 bipush 100 43 iastore 44 aload 5 46 arraylength 47 istore 6 49 return

打印:20java.lang.NoSuchFieldException: length
可以看到length并不是Array的成員變量。
五、Java語言規(guī)范關(guān)于Array的定義
數(shù)組在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:

  • The direct superclass of every array type is Object.
  • Every array type implements the interfaces Cloneable and java.io.Serializable.
  • 數(shù)組類型是由JVM從元素類型合成出來的。
    10.7. Array Members
    The members of an array type are all of the following:

  • The public final field length, which contains the number of components of the array. length may be positive or zero.
  • 從Java語言到Class文件,Java源碼編譯器會識別出對數(shù)組類型的length字段的訪問,并生成對應(yīng)的字節(jié)碼。
    以O(shè)penJDK8的javac為例:
    jdk8u/jdk8u/langtools: 84eb51777733 src/share/classes/com/sun/tools/javac/jvm/Gen.java

    base.load(); if (sym == syms.lengthVar) {code.emitop0(arraylength);result = items.makeStackItem(syms.intType); }

    六、數(shù)據(jù)應(yīng)用場景
    這種數(shù)據(jù)結(jié)構(gòu)使用一段連續(xù)的空間來存貯元素,所以可以直接通過索引來獲取到某個元素,而且可以通過對元素的內(nèi)容進行排序,然后使用二分法查找,從而提供查找效率。其適合的場合主要是:

  • 不會頻繁增刪元素的場合,因為增刪元素都牽涉到元素空間的重新分配,頻繁的內(nèi)存分配操作會大幅降低操作效率。但添加操作時,可以通過預(yù)分配足夠的空間來優(yōu)化添加時的效率。
  • 屬于隨機迭代器,可以隨機訪問任意元素。對于已排序的元素查找起來效率較高。
  • 七、數(shù)組總結(jié)
    在看數(shù)組的時候,因為class是動態(tài)創(chuàng)建的,所以看了很久,但是根據(jù)數(shù)組的特性,基本可以認(rèn)為數(shù)組的域和方法,類似于:

    class A<T> implements Cloneable, java.io.Serializable { public final int length = X; public T[] clone() { try { return (T[]) super.clone();} catch (CloneNotSupportedException e) { throw new InternalError(e.getMessage());}} }

    數(shù)組可以是一維數(shù)組、二維數(shù)組或多維數(shù)組。

    • 數(shù)值數(shù)組元素的默認(rèn)值為 0,而引用元素的默認(rèn)值為 null。
    • 交錯數(shù)組是數(shù)組的數(shù)組,因此,它的元素是引用類型,初始化為 null。交錯數(shù)組元素的維度和大小可以不同。
    • 數(shù)組的索引從 0 開始,如果數(shù)組有 n 個元素,那么數(shù)組的索引是從 0 到(n-1)。
    • 數(shù)組元素可以是任何類型,包括數(shù)組類型。
    • 數(shù)組類型是從抽象基類 Array 派生的引用類型。

    我的微信公眾號:架構(gòu)真經(jīng)(id:gentoo666),分享Java干貨,高并發(fā)編程,熱門技術(shù)教程,微服務(wù)及分布式技術(shù),架構(gòu)設(shè)計,區(qū)塊鏈技術(shù),人工智能,大數(shù)據(jù),Java面試題,以及前沿?zé)衢T資訊等。每日更新哦!


    參考文章:

  • https://www.cnblogs.com/ysocean/p/7894448.html
  • https://www.runoob.com/java/java-array.html
  • https://chaxiaoniu.oschina.io/2017/08/07/JavaArrayOfDataStructure/
  • https://blog.csdn.net/weixin_40617102/article/details/90264102
  • https://www.zhihu.com/question/29649110
  • http://c.biancheng.net/view/906.html
  • https://blog.51cto.com/14028890/2384977
  • 總結(jié)

    以上是生活随笔為你收集整理的根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。