自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于java數(shù)組的深度思考

開發(fā) 后端
數(shù)組是一種引用數(shù)據(jù)類型,是對(duì)象,要先創(chuàng)建后存取。一個(gè)數(shù)組可存儲(chǔ)同一種數(shù)據(jù)類型的數(shù)據(jù)。Java數(shù)組則是其中的一種,下面讓我們一起來了解一下Java數(shù)組吧。

剛剛開始接觸java數(shù)組的人都會(huì)聽到一句類似的話:java是純面向?qū)ο蟮恼Z言,他的數(shù)組也是一個(gè)對(duì)象。于是乎,我就按照一個(gè)對(duì)象的方式來使用數(shù)組,心安理得。直到我接觸到C的數(shù)組后,才發(fā)現(xiàn)將數(shù)組作為一個(gè)類來使用在實(shí)現(xiàn)上是多么的“不自然”。

首先我們看一下表面現(xiàn)象,數(shù)組創(chuàng)建的時(shí)候采用的是如下語句:

  1. MyClass[] arr = new MyClass[9]; 

 而普通類采用的是如下語句:

  1. MyClass obj = new MyClass();

就是說,創(chuàng)建數(shù)組的時(shí)候不使用小括號(hào)傳參。使得數(shù)組和普通類看起來就有很多不同,因?yàn)樾±ㄌ?hào)里的參數(shù)是傳遞給構(gòu)造方法的,進(jìn)而讓人感覺數(shù)組類是沒有構(gòu)造方法的。

再往深了想,還有很多讓人感覺不自然的東西??梢钥隙ǖ氖牵琷ava確實(shí)將數(shù)組作為了一個(gè)類來處理。還是用上面的例子說明:

可以通過以下方法得到MyClass[]的Class實(shí)例:

arr.getClass()或MyClass[].class.這樣,我就可以向數(shù)組類里面“窺探”了。

  1. Class clazz = MyClass[].class;  
  2. System.out.println(clazz.getConstructors()。length); 

打印出來的結(jié)果是0;證明數(shù)組類確實(shí)沒有構(gòu)造方法。

如果強(qiáng)行執(zhí)行clazz.newInstance();就會(huì)得到下面的錯(cuò)誤。

java.lang.InstantiationException: [Larraytest.MyClass;

證明數(shù)組類不能夠通過普通的反射方式來創(chuàng)建一個(gè)實(shí)例。

再看看數(shù)組類的“廬山真面目”:

System.out.println(clazz);

輸出是:

[Larraytest.MyClass

對(duì)Java Class文件結(jié)構(gòu)稍有了結(jié)就知道,這個(gè)字符串的意思就是一個(gè)元素類型為arraytest.MyClass的一維數(shù)組。也就是說,數(shù)組類型不是和普通類一樣,以一個(gè)全限定路徑名+類名來作為自己的***標(biāo)示的,而是以[+一個(gè)或者多個(gè)L+數(shù)組元素類全限定路徑+類來最為***標(biāo)示的。這個(gè)()也是數(shù)組和普通類的區(qū)別。而這個(gè)區(qū)別似乎在某種程度上說明數(shù)組和普通java類在實(shí)現(xiàn)上有很大區(qū)別。因?yàn)閖ava虛擬機(jī)(java指令集)在處理數(shù)組類和普通類的時(shí)候,肯定會(huì)做出區(qū)分。我猜想,可能會(huì)有專門的java虛擬機(jī)指令來處理數(shù)組。

既然我們可以得到數(shù)組的Class類實(shí)例,就說明肯定需要調(diào)用ClassLoader的defineClass(不一定非要是loadClass方法)方法,來構(gòu)造一個(gè)Class實(shí)例。java虛擬機(jī)規(guī)范規(guī)定,任何一個(gè)可以被加載的類,如果其類文件存儲(chǔ)在文件系統(tǒng)上,那么一個(gè)*.class文件只能存儲(chǔ)一個(gè)類信息,也就是說,數(shù)組類的信息不可能以類文件的形式存儲(chǔ)在本地磁盤上(否則任意一個(gè)類都要配有255個(gè)數(shù)組類了……),既然這樣,那就說明java虛擬機(jī)肯定內(nèi)置了一塊用來聲明數(shù)組類的數(shù)據(jù)(不管是幾級(jí)數(shù)組)。這是符合java虛擬機(jī)規(guī)范的,規(guī)范規(guī)定class類數(shù)據(jù)可以來自任意介質(zhì),包括本地磁盤、網(wǎng)絡(luò)、數(shù)據(jù)庫、內(nèi)存等等。

分析到這里,我基本上可以肯定:java對(duì)數(shù)組對(duì)象化的操作的支持是指令級(jí)的,也就是說java虛擬機(jī)有專門針對(duì)數(shù)組的指令。數(shù)組的Class類實(shí)例是java虛擬機(jī)動(dòng)態(tài)創(chuàng)建動(dòng)態(tài)加載的,其結(jié)構(gòu)與普通java類的Class實(shí)例有一些不同。

JDK API中有一個(gè)java.lang.reflect.Array類,這個(gè)類提供了很多方法(絕大多數(shù)是native方法,這在另一個(gè)方面證明了java對(duì)數(shù)組的支持是專用指令支持的,否則用本地方法干嘛^_^),用來彌補(bǔ)我們對(duì)數(shù)組操作的局限性。

 下面這句話用來創(chuàng)建一個(gè)一維的、長度為10的、類型為arraytest.MyClass的數(shù)組:

  1. arraytest.MyClass[] arr = (arraytest.MyClass[]) Array.newInstance(arraytest.MyClass, 10); 

 下面這句話用來創(chuàng)建一個(gè)二維的、3乘5的、類型為arraytest.MyClass的數(shù)組:

  1. int[] arrModel = new int[]{35};  
  2. Object arrObj = Array.newInstance(Sub.class, arrModel); 

 當(dāng)然你可以用一個(gè)數(shù)組的引用指向上面的二維數(shù)組,這里我們用一個(gè)Object的引用指向他。

使用的時(shí)候,我們也是可以利用Array類提供的方法來實(shí)現(xiàn):

  1. System.out.println(Array.getLength(arrObj);//***維長度為3  
  2. System.out.println(Array.getLength(Array.get(arrObj, 2)));//第二維長度為5,這里如果寫3,就會(huì)得到你意想之中的java.lang.ArrayIndexOutOfBoundsException 

打印結(jié)果是如我所想的:

3

5

對(duì)于數(shù)組的Class類實(shí)例,還有一些奇怪的現(xiàn)象:在運(yùn)行代碼java.lang.reflect.Field fieldarr = clazz.getField("length");的時(shí)候,會(huì)拋出異常:java.lang.NoSuchFieldException: length,這似乎在說數(shù)組類沒有l(wèi)ength這個(gè)域,而這個(gè)域其實(shí)是我們用的最多的一個(gè)(也就是說這個(gè)域是肯定存在的)。我想關(guān)于數(shù)組的Class類實(shí)例、數(shù)組的實(shí)現(xiàn)等,還有很多“貓膩”在里面。

順便說一句,java數(shù)組最多只能是255維的。這個(gè)讓人看到了C的影子,嘿嘿。

“Java把數(shù)組當(dāng)作一個(gè)java類來處理”說起來容易,用起來自然,但是細(xì)細(xì)想來,還是有很多不簡單的地方呀。

Java數(shù)組元素的靈活性比較大。一個(gè)數(shù)組的元素本身也可以是數(shù)組,只要所有元素的數(shù)組類型相同即可。我們知道數(shù)組的類型和長度無關(guān),因此元素可以是長度不同的數(shù)組。這樣,Java的多維數(shù)組就不一定是規(guī)規(guī)矩矩的矩陣了,可以千變?nèi)f化。希望通過上文的分析,可以幫助到你。

責(zé)任編輯:于鐵 來源: 幫考網(wǎng)
相關(guān)推薦

2019-05-14 14:10:34

工業(yè)物聯(lián)網(wǎng)物聯(lián)網(wǎng)IOT

2017-06-27 14:49:20

深度學(xué)習(xí)機(jī)器學(xué)習(xí)

2024-12-18 08:33:01

2011-06-03 13:03:03

JAVA

2012-03-07 10:34:44

Java

2021-12-08 10:54:09

汽車智能芯片

2022-08-01 07:38:29

代碼開發(fā)

2010-01-08 09:30:03

Java數(shù)組JVM

2012-11-08 11:19:38

2021-03-15 08:25:49

數(shù)據(jù)分析互聯(lián)網(wǎng)運(yùn)營大數(shù)據(jù)

2010-06-18 15:03:12

BGP路由協(xié)議

2013-04-18 09:29:02

編程語言編程

2022-05-27 11:46:48

技術(shù)能力思考

2012-06-20 10:07:35

應(yīng)用商店Android

2012-04-02 15:52:11

2021-06-25 14:41:42

網(wǎng)絡(luò)安全

2020-05-19 08:52:31

APP滲透測(cè)試終端安全

2009-02-24 10:51:30

2013-05-21 10:06:11

數(shù)據(jù)庫查詢優(yōu)化

2017-08-10 15:50:44

PHP協(xié)程阻塞
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)