精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

有關JVM處理Java數組方法的思考

開發 后端
在Java中,獲取數組的長度和String的長度是兩種不同的方法,這引起了本文作者的一番思考。本文從JVM的角度,探討了Java數組在JVM中是什么對象,有哪些成員,以及聲明方法。

本文來自jarfield的博客,原文標題為《為什么如此獲取Java數組的長度》。

記得vamcily 曾問我:“為什么獲取數組的長度用.length(成員變量的形式),而獲取String的長度用.length()(成員方法的形式)?”

我當時一聽,覺得問得很有道理。做同樣一件事情,為什么采用兩種風格迥異的風格呢?況且,Java中的數組其實是完備(full-fledged)的對象,直接暴露成員變量,可能不是一種很OO的風格。那么,設計Java的那幫天才為什么這么做呢?

帶著這個疑問,我查閱了一些資料,主要是關于“JVM是如何處理數組”的。

數組對象的類是什么?

既然數組都是對象,那么數組的類究竟是什么呢?當然不是java.util.Arrays啦!我們以int一維數組為例,看看究竟。

  1. public class Main {   
  2. public static void main(String args[]){   
  3. int a[] = new int[10]; Class clazz = a.getClass();   
  4. System.out.println(clazz.getName());   
  5. }   
  6. }  
  7.  

在SUN JDK 1.6上運行上述代碼,輸出為:

[I

看起來數組的類很奇怪,非但不屬于任何包,而且名稱還不是合法的標識符(identifier)。具體的命名規則[1]可以參見java.lang.Class.getName()的javadoc。簡單的說,數組的類名由若干個'['和數組元素類型的內部名稱組成,'['的數目代表了數組的維度。

具有相同類型元素和相同維度的數組,屬于同一個類。如果兩個數組的元素類型相同,但維度不同,那么它們也屬于不同的類。如果兩個數組的元素類型和維度均相同,但長度不同,那么它們還是屬于同一個類。

數組的類有哪些成員呢?

既然我們知道了數組的類名是什么,那么就去看看數組的類究竟是什么樣的吧?有哪些成員變量?有哪些成員方法?length這個成員變量在哪?是不是沒有length()這個成員方法?

找來找去,在JDK的代碼中沒有找打'[I'這個類。想想也對,'[I'都不是一個合法的標識符,肯定不會出現public class [I {...}這樣的Java代碼。我們暫且不管[I類是誰聲明的,怎么聲明的,先用反射機制一探究竟吧。

  1. public class Main {   
  2. public static void main(String[] args) {   
  3. int a[] = new int[10]; 
  4. Class clazz = a.getClass();   
  5. System.out.println(clazz.getDeclaredFields().length);   
  6. System.out.println(clazz.getDeclaredMethods().length);   
  7. System.out.println(clazz.getDeclaredConstructors().length);   
  8. System.out.println(clazz.getDeclaredAnnotations().length);   
  9. System.out.println(clazz.getDeclaredClasses().length);   
  10. System.out.println(clazz.getSuperclass());   
  11. }   
  12. }  
  13.  

在SUN JDK 1.6上運行上述代碼,輸出為:

  1. 0 
  2. 0 
  3. 0 
  4. 0 
  5. 0 
  6. class java.lang.Object  
  7.  

可見,[I這個類是java.lang.Object的直接子類,自身沒有聲明任何成員變量、成員方法、構造函數和Annotation,可以說,[I就是個空類。我們立馬可以想到一個問題:怎么連length這個成員變量都沒有呢?如果真的沒有,編譯器怎么不報語法錯呢?想必編譯器對Array.length進行了特殊處理哇!

數組的類在哪里聲明的?

先不管為什么沒有length成員變量,我們先搞清楚[I這個類是哪里聲明的吧。既然[I都不是合法的標識符,那么這個類肯定在Java代碼中顯式聲明的。想來想去,只能是JVM自己在運行時生成的了。JVM生成類還是一件很容易的事情,甚至無需生成字節碼,直接在方法區中創建類型數據,就差不多完工了。

還沒有實力去看JVM的源代碼,于是翻了翻The JavaTM Virtual Machine Specification  Second Edition,果然得到了驗證,相關內容參考5.3.3 Creating Array Classes。

規范的描述很嚴謹,還摻雜了定義類加載器和初始化類加載器的內容。先不管這些,簡單概括一下:

類加載器先看看數組類是否已經被創建了。如果沒有,那就說明需要創建數組類;如果有,那就無需創建了。

如果數組元素是引用類型,那么類加載器首先去加載數組元素的類。

JVM根據元素類型和維度,創建相應的數組類。

呵呵,果然是JVM這家伙自個偷偷創建了[I類。JVM不把數組類放到任何包中,也不給他們起個合法的標識符名稱,估計是為了避免和JDK、第三方及用戶自定義的類發生沖突吧。

再想想,JVM也必須動態生成數組類,因為Java數組類的數量與元素類型、維度(最多255)有關,相當相當多了,是沒法預先聲明好的。

居然沒有length這個成員變量!

我們已經發現,偷懶的JVM沒有為數組類生成length這個成員變量,那么Array.length這樣的語法如何通過編譯,如何執行的呢?

讓我們看看字節碼吧!編寫一段最簡單的代碼,使用jclasslib查看字節碼。

  1. public class Main {   
  2. public static void main(String[] args)   
  3. int a[] = new int[2]; int i = a.length;   
  4. }   
  5. }  
  6.  

使用SUN JDK 1.6編譯上述代碼,并使用jclasslib打開Main.class文件,得到main方法的字節碼:

  1. 0 iconst_2                   //將int型常量2壓入操作數棧  
  2. 1 newarray 10 (int)    //將2彈出操作數棧,作為長度,創建一個元素類型為int, 維度為1的數組,并將數組的引用壓入操作數棧  
  3. 3 astore_1                 //將數組的引用從操作數棧中彈出,保存在索引為1的局部變量(即a)中  
  4. 4 aload_1                  //將索引為1的局部變量(即a)壓入操作數棧  
  5. 5 arraylength            //從操作數棧彈出數組引用(即a),并獲取其長度(JVM負責實現如何獲取),并將長度壓入操作數棧  
  6. 6 istore_2                 //將數組長度從操作數棧彈出,保存在索引為2的局部變量(即i)中  
  7. 7 return                    //main方法返回  
  8.  

可見,在這段字節碼中,根本就沒有看見length這個成員變量,獲取數組長度是由一條特定的指令arraylength實現(怎么實現就不管了,JVM總有辦法)。編譯器對Array.length這樣的語法做了特殊處理,直接編譯成了arraylength指令。另外,JVM創建數組類,應該就是由newarray這條指令觸發的了。

很自然地想到,編譯器也可以對Array.length()這樣的語法做特殊處理,直接編譯成arraylength指令。這樣的話,我們就可以使用方法調用的風格獲取數組的長度了,這樣看起來貌似也更加OO一點。那為什么不使用Array.length()的語法呢?也許是開發Java的那幫天才對.length有所偏愛,或者拋硬幣拍腦袋隨便決定的吧。 形式不重要,重要的是我們明白了背后的機理。

Array in Java

最后,對Java中純對象的數組發表點感想吧。

#t#相比C/C++中的數組,Java數組在安全性要好很多。C/C++常遇到的緩存區溢出或數組訪問越界的問題,在Java中不再存在。因為Java使用特定的指令訪問數組的元素,這些指令都會對數組的長度進行檢查。如果發現越界,就會拋出java.lang.ArrayIndexOutOfBoundsException。

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

責任編輯:yangsai 來源: JavaEye博客
相關推薦

2022-11-13 15:33:30

JavaScript數組開發

2019-07-25 10:08:05

JavaScript數組轉換

2023-07-04 15:52:49

JavaScript數組

2023-02-01 08:31:48

2016-10-08 21:25:36

Javascript數組Web

2024-10-21 13:05:40

2020-03-19 15:30:08

JavaScript數組字符串

2022-11-23 16:12:57

JavaScript數據類型數組

2022-05-06 12:03:16

數組Javascript

2021-02-07 07:52:07

數組 JavaScript結構

2022-09-15 08:05:16

緩沖區類型TypedArray

2025-02-10 07:00:00

JavaScript數組方法前端

2022-04-28 08:41:53

JavaScript數組

2011-04-13 14:04:14

Java數組

2023-11-14 16:57:10

2009-06-11 13:00:08

Java數組賦值

2024-03-21 14:27:13

JavaScript數組

2010-09-27 13:41:22

JVM內存回收

2009-07-09 17:36:58

jvm.cfg

2022-08-10 12:02:52

面試JavaScript
點贊
收藏

51CTO技術棧公眾號

尤物在线免费视频| 羞羞的视频在线| 日韩一卡二卡在线| 99精品国产在热久久| 国产视频久久久久久久| 国产美女主播在线播放 | 亚洲18色成人| 日本亚洲自拍| 一级特黄aaaaaa大片| 伊人色**天天综合婷婷| 亚洲国产精品久久久久秋霞蜜臀| 亚洲熟妇无码一区二区三区| 国产区视频在线播放| 久久99国产精品免费网站| 欧美另类高清videos| 人体私拍套图hdxxxx| 日本国产欧美| 亚洲资源中文字幕| 日本欧洲国产一区二区| 国产女18毛片多18精品| 亚洲日本黄色| 久久偷看各类女兵18女厕嘘嘘| 97精品人人妻人人| 日本成人福利| 亚洲福利一二三区| 日韩一区二区三区资源| 噜噜噜久久,亚洲精品国产品| 亚洲一区不卡| 久精品免费视频| 国产亚洲精品熟女国产成人| 一区二区在线视频观看| 欧美视频在线一区二区三区| 91免费黄视频| 青青草视频在线免费观看| 国产中文一区二区三区| 欧美有码在线观看视频| 久久久久99精品成人片毛片| 成人写真视频| 亚洲欧美激情视频| 久久久无码人妻精品无码| 亚洲国产尤物| 色噜噜狠狠成人网p站| 国产无限制自拍| 激情成人四房播| 国产欧美一区二区在线| 亚洲一区久久久| 中文字幕乱码在线观看| 国产精品久久久一区二区| 欧美多人爱爱视频网站| 91香蕉视频网| 青青草原综合久久大伊人精品 | 国产熟女一区二区三区五月婷| 久久精选视频| 欧美亚洲免费电影| 男人天堂中文字幕| 欧美精品日韩| 欧美成人高清视频| 性欧美疯狂猛交69hd| 日本欧美视频| 在线免费观看羞羞视频一区二区| 深爱五月激情网| 看全色黄大色大片免费久久久| 欧美xxxx在线观看| 丰满人妻一区二区三区大胸| 国产精品天堂蜜av在线播放 | 五月天婷婷激情| 亚洲一区自拍| 日本乱人伦a精品| aaa在线视频| 天堂成人国产精品一区| 欧美一区二区三区精品电影| 日本一级一片免费视频| 一区二区福利| 欧美一级片免费在线| 久久99国产综合精品免费| 在线看片成人| 欧洲美女7788成人免费视频| 成人精品在线看| 国产日韩亚洲欧美精品| 欧美亚洲国产视频| 懂色av中文字幕| 美日韩一区二区| 成人免费福利视频| 亚洲AV无码国产精品午夜字幕| 韩国成人福利片在线播放| 成人免费看黄网站| 懂色av一区二区三区四区| bt7086福利一区国产| 免费亚洲一区二区| 国产视频福利在线| 亚洲三级久久久| 免费看毛片的网址| 五月天国产在线| 在线精品视频免费观看| 亚洲国产日韩欧美在线观看| 精品国产一区二区三区性色av| 日韩免费性生活视频播放| 97人妻精品一区二区三区免费| 免费萌白酱国产一区二区三区| 亚洲免费一在线| 女同久久另类69精品国产| 欧美成人tv| 91精品国产一区| japanese国产在线观看| 国产一区二区三区久久悠悠色av | 你懂的国产在线| 极品销魂美女一区二区三区| 国产福利久久| 国产视频三级在线观看播放| 亚洲免费视频成人| 欧美 日韩 激情| 欧美综合社区国产| 亚洲国产高清自拍| 美国黄色特级片| 在线欧美一区| 成人黄色在线观看| 青春有你2免费观看完整版在线播放高清| 久久亚洲欧美国产精品乐播| 26uuu成人| 日韩免费va| 精品免费视频一区二区| 久久久免费看片| 国产日韩综合| 俄罗斯精品一区二区三区| 成人av电影观看| 亚洲二区在线观看| 免费网站在线观看黄| 蜜桃tv一区二区三区| 欧美大片在线看| 国产又大又黄的视频| 2020国产精品久久精品美国| 99久久免费观看| 成人精品国产亚洲| 亚洲精品一区二区网址| 久久免费精彩视频| 精品一区二区三区久久| 免费成人深夜夜行视频| 国产偷倩在线播放| 欧美精品在线观看一区二区| 一区二区三区久久久久| 夜夜嗨av一区二区三区网站四季av| 91精品久久久久久久久久入口| 国产三级视频在线播放线观看| 一区二区三区在线播| 中文字幕永久有效| 欧美先锋资源| 国产99视频精品免视看7| 好吊色视频一区二区| 亚洲美女淫视频| mm131国产精品| 欧美人妖在线观看| 欧美极品美女电影一区| 精品人妻无码一区二区| 亚洲视频网在线直播| 国产一级片黄色| 女厕嘘嘘一区二区在线播放| 欧美在线免费视频| 开心激情综合网| 亚洲午夜精品网| 中文字幕99页| 91久久夜色精品国产九色| 亚洲自拍偷拍色片视频| av超碰免费在线| 3d动漫精品啪啪1区2区免费| 可以免费看av的网址| 蜜桃一区二区三区在线| 亚洲精品在线免费看| 福利视频一区| 最近2019年手机中文字幕| 在线观看免费视频一区| 国产精品乱子久久久久| 午夜久久福利视频| 亚洲破处大片| 国产精品白丝jk白祙| 国产成人l区| 日韩欧美国产1| 国产一级视频在线| 国产凹凸在线观看一区二区| 精品视频在线观看一区| 亚洲免费毛片| 国产精品成熟老女人| 一区二区三区视频网站| 91精品国产一区二区人妖| 久草视频在线资源站| caoporn国产一区二区| 久久精品视频91| 91精品国产乱码久久久久久久 | 亚洲精品视频在线播放 | 狠狠噜噜久久| 欧美日韩在线精品| 欧洲精品一区二区三区| 日韩视频精品在线| 免费观看黄色一级视频| 色婷婷国产精品综合在线观看| 永久免费观看片现看| 国产乱码精品一区二区三| 日本福利视频一区| 亚洲美女久久| 亚洲综合视频1区| 不卡福利视频| 亚洲三级av在线| 国产特级黄色片| 日韩欧美在线免费| 色哟哟一一国产精品| 波多野洁衣一区| 日日噜噜夜夜狠狠| 四虎成人av| 久久精品国产精品青草色艺| 狂野欧美性猛交xxxx| 欧美黑人国产人伦爽爽爽| 九色视频在线播放| 欧美一卡二卡三卡| 亚洲精品77777| 亚洲欧洲另类国产综合| 在线观看av中文字幕| 精品一区二区国语对白| 九一国产精品视频| 国产精品99一区二区三| 精品无码久久久久久久动漫| 99精品美女视频在线观看热舞| 欧美精品videos性欧美| 日本电影全部在线观看网站视频| 日韩电影中文字幕一区| 中文字幕在线播放不卡| 精品色蜜蜜精品视频在线观看| 91香蕉视频污在线观看| 91视频你懂的| 自拍偷拍激情视频| 国产麻豆成人传媒免费观看| 亚洲综合婷婷久久| 蜜桃视频一区二区三区在线观看| 中文字幕无码不卡免费视频| 亚洲在线观看| 国产a级一级片| 国产欧美一区二区三区国产幕精品| 免费网站永久免费观看| 欧美日韩三级| 国产freexxxx性播放麻豆| 欧美日韩国产在线一区| 免费观看国产视频在线| 亚洲二区三区不卡| 天天综合中文字幕| 国产精品伦理久久久久久| 国产精品av免费| 亚洲91视频| 日韩中文字幕亚洲精品欧美| 综合久久久久| 黄色a级片免费看| 亚洲裸体俱乐部裸体舞表演av| 国产女主播自拍| 亚洲一区亚洲| 三级在线免费看| 激情五月婷婷综合网| 天天操夜夜操很很操| 国产精品1区2区| 国产一级黄色录像| 91丨九色丨尤物| 国产真实乱人偷精品人妻| 国产日韩精品一区二区三区在线| 无码人中文字幕| 一区二区三区高清| 久久夜靖品2区| 色欧美片视频在线观看| 在线观看免费中文字幕| 欧美一区2区三区4区公司二百| 99久在线精品99re8热| 亚洲一区二区三区爽爽爽爽爽| 久久成人在线观看| 亚洲成人av福利| 天堂网中文字幕| 欧美日韩精品福利| 99视频在线观看免费| 欧美tickling挠脚心丨vk| 无码国产伦一区二区三区视频| 亚洲男人av电影| 日韩在线观看www| 欧美高清激情视频| 欧美一级鲁丝片| 国产狼人综合免费视频| 蜜桃精品视频| 欧美日韩在线精品| 亚洲午夜精品一区 二区 三区| 拔插拔插海外华人免费| 日韩av一级片| 风韵丰满熟妇啪啪区老熟熟女| xfplay精品久久| 2025国产精品自拍| 欧美体内谢she精2性欧美| 一级片一区二区三区| 亚洲国产成人精品久久| 欧美成年黄网站色视频| 国内揄拍国内精品| 欧美大陆国产| 久久久久久欧美精品色一二三四| 日韩在线精品| 日本少妇高潮喷水视频| 久久99国产精品免费| 久久无码人妻精品一区二区三区| 国产精品的网站| 天堂网av手机版| 91精品国产美女浴室洗澡无遮挡| 亚洲三级黄色片| 欧美大成色www永久网站婷| 男人皇宫亚洲男人2020| 亚洲精品免费一区二区三区| 香蕉久久精品| 日本一道在线观看| 麻豆精品在线观看| 国产偷人妻精品一区| 亚洲精品一二三四区| 中文字幕自拍偷拍| 日韩精品视频免费在线观看| 制服丝袜在线播放| 国产精品日韩欧美大师| 亚洲调教一区| 欧美,日韩,国产在线| 国产精品一级在线| 五月婷婷六月香| 91成人看片片| 欧美在线观看在线观看| 久久久久久欧美| 精品一区二区三区视频在线播放| 视频在线精品一区| 香蕉成人久久| 日本aaa视频| 天天色图综合网| 四虎永久在线精品免费网址| 久久亚洲精品网站| 日韩一级二级| 日韩欧美亚洲日产国产| 久久九九精品| 泷泽萝拉在线播放| 偷拍日韩校园综合在线| 天堂中文在线观看视频| 久久噜噜噜精品国产亚洲综合| 日韩中文一区二区| 国产精品久久久影院| 国产在线看一区| 91嫩草|国产丨精品入口| 欧美日韩精品一区二区三区 | 精品不卡在线视频| 污影院在线观看| 999国内精品视频在线| 一区二区三区四区日韩| 欧美一级特黄aaa| 亚洲视频一二三| 国产成人精品一区二区无码呦| 乱亲女秽乱长久久久| 日韩精品久久久久久久软件91| 97超碰在线视| 国产成人午夜精品影院观看视频 | 91色精品视频在线| 香蕉视频国产精品 | 福利网址在线观看| 亚洲三级黄色在线观看| 成人毛片免费| 神马午夜伦理影院| 成人午夜在线视频| 天堂网一区二区三区| 国产亚洲一区精品| 福利一区二区| 50度灰在线观看| 成人avav影音| 久久精品偷拍视频| 日韩视频免费中文字幕| 66精品视频在线观看| 777精品久无码人妻蜜桃| 久久久久青草大香线综合精品| 亚洲精品久久久久久久蜜桃| 色噜噜国产精品视频一区二区| 精品三级久久久| 性欧美大战久久久久久久| 国产午夜亚洲精品羞羞网站| 中文字幕在线播放日韩| 欧美成人免费在线观看| 久久久久97| 欧美午夜aaaaaa免费视频| 日韩毛片高清在线播放| 精品国产av一区二区| 4p变态网欧美系列| 日韩欧美中字| 日韩Av无码精品| 欧美系列在线观看| 天堂亚洲精品| 五月天色一区| 粉嫩久久99精品久久久久久夜| 中文字幕69页| 欧美福利视频网站| 凹凸成人精品亚洲精品密奴| 69xxx免费视频| 欧美性色黄大片| 波多野结衣在线观看| 台湾成人av| 99久久久无码国产精品| 一起草av在线| 日本欧美爱爱爱| 在线 亚洲欧美在线综合一区| 精品丰满少妇一区二区三区| 亚洲国产精品福利| 国产一区二区三区视频在线|