日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

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

版權(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ū)別。

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;}

注意:定義并初始化一個(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.
0 bipush 112 anewarray #12 <java/lang/String> //anewarray代表對(duì)象數(shù)組5 astore_16 aload_17 iconst_08 ldc #25 <1aaa> 10 aastore 11 aload_1 12 arraylength //arraylength代表長(zhǎng)度 13 istore_2 14 bipush 11 16 anewarray #26 <java/lang/Integer> //anewarray代表包裝類(lèi)數(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ù)組類(lèi)型數(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語(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:

  • The direct superclass of every array type is Object.
  • Every array type implements the interfaces Cloneable and java.io.Serializable.
  • 數(shù)組類(lèi)型是由JVM從元素類(lèi)型合成出來(lái)的。
    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語(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

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

    六、數(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)合主要是:

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

    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。
    • 交錯(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)資訊等。每日更新哦!


    參考文章:

  • 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)-数组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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