成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于java數組的深度思考

開發 后端
數組是一種引用數據類型,是對象,要先創建后存取。一個數組可存儲同一種數據類型的數據。Java數組則是其中的一種,下面讓我們一起來了解一下Java數組吧。

剛剛開始接觸java數組的人都會聽到一句類似的話:java是純面向對象的語言,他的數組也是一個對象。于是乎,我就按照一個對象的方式來使用數組,心安理得。直到我接觸到C的數組后,才發現將數組作為一個類來使用在實現上是多么的“不自然”。

首先我們看一下表面現象,數組創建的時候采用的是如下語句:

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

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

  1. MyClass obj = new MyClass();

就是說,創建數組的時候不使用小括號傳參。使得數組和普通類看起來就有很多不同,因為小括號里的參數是傳遞給構造方法的,進而讓人感覺數組類是沒有構造方法的。

再往深了想,還有很多讓人感覺不自然的東西。可以肯定的是,java確實將數組作為了一個類來處理。還是用上面的例子說明:

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

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

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

打印出來的結果是0;證明數組類確實沒有構造方法。

如果強行執行clazz.newInstance();就會得到下面的錯誤。

java.lang.InstantiationException: [Larraytest.MyClass;

證明數組類不能夠通過普通的反射方式來創建一個實例。

再看看數組類的“廬山真面目”:

System.out.println(clazz);

輸出是:

[Larraytest.MyClass

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

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

分析到這里,我基本上可以肯定:java對數組對象化的操作的支持是指令級的,也就是說java虛擬機有專門針對數組的指令。數組的Class類實例是java虛擬機動態創建動態加載的,其結構與普通java類的Class實例有一些不同。

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

 下面這句話用來創建一個一維的、長度為10的、類型為arraytest.MyClass的數組:

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

 下面這句話用來創建一個二維的、3乘5的、類型為arraytest.MyClass的數組:

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

 當然你可以用一個數組的引用指向上面的二維數組,這里我們用一個Object的引用指向他。

使用的時候,我們也是可以利用Array類提供的方法來實現:

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

打印結果是如我所想的:

3

5

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

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

“Java把數組當作一個java類來處理”說起來容易,用起來自然,但是細細想來,還是有很多不簡單的地方呀。

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

責任編輯:于鐵 來源: 幫考網
相關推薦

2019-05-14 14:10:34

工業物聯網物聯網IOT

2017-06-27 14:49:20

深度學習機器學習

2024-12-18 08:33:01

2021-12-08 10:54:09

汽車智能芯片

2022-08-01 07:38:29

代碼開發

2011-06-03 13:03:03

JAVA

2012-03-07 10:34:44

Java

2010-01-08 09:30:03

Java數組JVM

2012-11-08 11:19:38

2010-06-18 15:03:12

BGP路由協議

2013-04-18 09:29:02

編程語言編程

2021-03-15 08:25:49

數據分析互聯網運營大數據

2022-05-27 11:46:48

技術能力思考

2012-04-02 15:52:11

2012-06-20 10:07:35

應用商店Android

2021-06-25 14:41:42

網絡安全

2009-02-24 10:51:30

2020-05-19 08:52:31

APP滲透測試終端安全

2013-05-21 10:06:11

數據庫查詢優化

2017-08-10 15:50:44

PHP協程阻塞
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美一区二区久久性色99 | 亚洲视频三区 | 一区二区三区国产精品 | 999久久久久久久久6666 | 韩日精品在线观看 | 国产成人综合亚洲欧美94在线 | 免费一区| 欧美在线a | 久久综合久久综合久久综合 | 久久精品91久久久久久再现 | 亚洲一区二区三区免费视频 | 蜜桃av鲁一鲁一鲁一鲁 | 久久国产精品偷 | 狠狠干五月天 | 999www视频免费观看 | 日韩视频在线观看一区二区 | 国产精品视频播放 | 久久精品免费一区二区三 | 天天综合成人网 | 国产精品夜间视频香蕉 | 中日字幕大片在线播放 | 国产精品69av | 国产午夜精品一区二区三区四区 | 福利社午夜影院 | 日韩在线免费视频 | 福利网站导航 | 国产在线第一页 | 九一国产精品 | 一区二区视频在线观看 | 综合色在线 | 日韩在线观看一区 | 玖玖色在线视频 | 日日干夜夜操 | 久久99精品久久 | 色网站在线免费观看 | 91麻豆精品一区二区三区 | 国产精品福利在线 | 夜夜精品浪潮av一区二区三区 | 中文字幕在线观看一区 | 精品日韩在线 | 午夜精品久久久久久久久久久久 |