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

我說我精通字符串,面試官竟然問我Java中的String有沒有長度限制!

開發(fā) 開發(fā)工具
關(guān)于String有沒有長度限制的問題,我之前單獨寫過一篇文章分析過,最近我又抽空回顧了一下這個問題,發(fā)現(xiàn)又有了一些新的認識。于是準備重新整理下這個內(nèi)容。

[[326848]]

關(guān)于String有沒有長度限制的問題,我之前單獨寫過一篇文章分析過,最近我又抽空回顧了一下這個問題,發(fā)現(xiàn)又有了一些新的認識。于是準備重新整理下這個內(nèi)容。

這次在之前那篇文章的基礎(chǔ)上除了增加了一些驗證過程外,還有些錯誤內(nèi)容的修正。我這次在分析過程中會嘗試對Jdk的編譯過程進行debug,并且會參考一些JVM規(guī)范等全方面的介紹下這個知識點。因為這個問題涉及到Java的編譯原理相關(guān)的知識,所以通過視頻的方式講解會更加容易理解一些,視頻我上傳到了B站,大家可以到文末點擊閱讀原文查看。

String的長度限制

想要搞清楚這個問題,首先我們需要翻閱一下String的源碼,看下其中是否有關(guān)于長度的限制或者定義。

String類中有很多重載的構(gòu)造函數(shù),其中有幾個是支持用戶傳入length來執(zhí)行長度的:

  1. public String(byte bytes[], int offset, int length)  

可以看到,這里面的參數(shù)length是使用int類型定義的,那么也就是說,String定義的時候,最大支持的長度就是int的最大范圍值。

根據(jù)Integer類的定義,java.lang.Integer#MAX_VALUE的最大值是2^31 - 1;

那么,我們是不是就可以認為String能支持的最大長度就是這個值了呢?

其實并不是,這個值只是在運行期,我們構(gòu)造String的時候可以支持的一個最大長度,而實際上,在運行期,定義字符串的時候也是有長度限制的。

如以下代碼:

  1. String s = "11111...1111";//其中有10萬個字符"1" 

當我們使用如上形式定義一個字符串的時候,當我們執(zhí)行javac編譯時,是會拋出異常的,提示如下:

  1. 錯誤: 常量字符串過長 

那么,明明String的構(gòu)造函數(shù)指定的長度是可以支持2147483647(2^31 - 1)的,為什么像以上形式定義的時候無法編譯呢?其實,形如String s = "xxx";定義String的時候,xxx被我們稱之為字面量,這種字面量在編譯之后會以常量的形式進入到Class常量池。那么問題就來了,因為要進入常量池,就要遵守常量池的有關(guān)規(guī)定。

常量池限制

我們知道,javac是將Java文件編譯成class文件的一個命令,那么在Class文件生成過程中,就需要遵守一定的格式。

根據(jù)《Java虛擬機規(guī)范》中第4.4章節(jié)常量池的定義,CONSTANT_String_info 用于表示 java.lang.String 類型的常量對象,格式如下:

  1. CONSTANT_String_info { 
  2.  
  3.     u1 tag; 
  4.  
  5.     u2 string_index; 
  6.  

其中,string_index 項的值必須是對常量池的有效索引, 常量池在該索引處的項必須是 CONSTANT_Utf8_info 結(jié)構(gòu),表示一組 Unicode 碼點序列,這組 Unicode 碼點序列最終會被初始化為一個 String 對象。

CONSTANT_Utf8_info 結(jié)構(gòu)用于表示字符串常量的值:

  1. CONSTANT_Utf8_info { 
  2.  
  3.     u1 tag; 
  4.  
  5.     u2 length; 
  6.  
  7.     u1 bytes[length]; 
  8.  

其中,length則指明了 bytes[]數(shù)組的長度,其類型為u2,

通過翻閱《規(guī)范》,我們可以獲悉。u2表示兩個字節(jié)的無符號數(shù),那么1個字節(jié)有8位,2個字節(jié)就有16位。

16位無符號數(shù)可表示的最大值位2^16 - 1 = 65535。

也就是說,Class文件中常量池的格式規(guī)定了,其字符串常量的長度不能超過65535。

那么,我們嘗試使用以下方式定義字符串:

  1. String s = "11111...1111";//其中有65535萬個字符"1" 

嘗試使用javac編譯,同樣會得到"錯誤: 常量字符串過長",那么原因是什么呢?

其實,這個原因在javac的代碼中是可以找到的,在Gen類中有如下代碼:

  1. private void checkStringConstant(DiagnosticPosition var1, Object var2) { 
  2.  
  3.     if (this.nerrs == 0 && var2 != null && var2 instanceof String  
  4.         && ((String)var2).length() >= 65535) { 
  5.  
  6.         this.log.error(var1, "limit.string", new Object[0]); 
  7.  
  8.         ++this.nerrs; 
  9.  
  10.     } 
  11.  

代碼中可以看出,當參數(shù)類型為String,并且長度大于等于65535的時候,就會導(dǎo)致編譯失敗。

這個地方大家可以嘗試著debug一下javac的編譯過程(視頻中有對java的編譯過程進行debug的方法),也可以發(fā)現(xiàn)這個地方會報錯。

如果我們嘗試以65534個字符定義字符串,則會發(fā)現(xiàn)可以正常編譯。

其實,關(guān)于這個值,在《Java虛擬機規(guī)范》也有過說明:

if the Java Virtual Machine code for a method is exactly 65535 bytes long and ends with an instruction that is 1 byte long, then that instruction cannot be protected by an exception handler. A compiler writer can work around this bug by limiting the maximum size of the generated Java Virtual Machine code for any method, instance initialization method, or static initializer (the size of any code array) to 65534 bytes

運行期限制

上面提到的這種String長度的限制是編譯期的限制,也就是使用String s= “”;這種字面值方式定義的時候才會有的限制。

那么。String在運行期有沒有限制呢,答案是有的,就是我們前文提到的那個Integer.MAX_VALUE ,這個值約等于4G,在運行期,如果String的長度超過這個范圍,就可能會拋出異常。(在jdk 1.9之前)

int 是一個 32 位變量類型,取正數(shù)部分來算的話,他們最長可以有

  1. 2^31-1 =2147483647 個 16-bit Unicodecharacter 
  2.  
  3.  
  4.  
  5. 2147483647 * 16 = 34359738352 位 
  6.  
  7. 34359738352 / 8 = 4294967294 (Byte) 
  8.  
  9. 4294967294 / 1024 = 4194303.998046875 (KB) 
  10.  
  11. 4194303.998046875 / 1024 = 4095.9999980926513671875 (MB) 
  12.  
  13. 4095.9999980926513671875 / 1024 = 3.99999999813735485076904296875 (GB) 

有近 4G 的容量。

很多人會有疑惑,編譯的時候最大長度都要求小于65535了,運行期怎么會出現(xiàn)大于65535的情況呢。這其實很常見,如以下代碼:

  1. String s = ""
  2.  
  3. for (int i = 0; i <100000 ; i++) { 
  4.  
  5.     s+="i"
  6.  

得到的字符串長度就有10萬,另外我之前在實際應(yīng)用中遇到過這個問題。

之前一次系統(tǒng)對接,需要傳輸高清圖片,約定的傳輸方式是對方將圖片轉(zhuǎn)成BASE6編碼,我們接收到之后再轉(zhuǎn)成圖片。

在將BASE64編碼后的內(nèi)容賦值給字符串的時候就拋了異常。

總結(jié)

字符串有長度限制,在編譯期,要求字符串常量池中的常量不能超過65535,并且在javac執(zhí)行過程中控制了最大值為65534。

在運行期,長度不能超過Int的范圍,否則會拋異常。

最后,這個知識點 ,我錄制了視頻,其中有關(guān)于如何進行實驗測試、如何查閱Java規(guī)范以及如何對javac進行deubg的技巧。

 

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2021-12-02 08:19:06

MVCC面試數(shù)據(jù)庫

2020-11-10 13:47:29

String源碼長度限制

2023-01-03 18:06:42

高并發(fā)架構(gòu)

2020-02-24 16:45:38

Java基礎(chǔ)代碼

2023-01-26 02:16:17

2022-04-10 18:10:24

CURD鏈表

2024-04-10 09:47:59

Java調(diào)度虛擬線程

2021-04-14 18:58:01

虛擬機 Java內(nèi)存

2024-08-05 01:26:54

2020-12-01 11:50:49

數(shù)據(jù)庫Redis面試

2021-04-01 08:12:20

zookeeper集群源碼

2021-12-06 08:30:49

SpringSpring Bean面試題

2024-09-03 09:20:45

2021-09-29 19:17:51

編碼URLEncodeGBK

2022-04-19 07:31:28

事務(wù)隔離機制數(shù)據(jù)庫

2020-07-02 07:52:11

RedisHash映射

2021-11-24 10:10:32

axios前端攔截器

2020-02-25 16:56:02

面試官有話想說

2022-05-24 08:03:28

InnoDBMySQL數(shù)據(jù)

2019-12-02 10:51:11

Redis存儲系統(tǒng)
點贊
收藏

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

国产一区二区三区三州| 国产欧美激情视频| 男人的天堂在线免费视频| 日韩国产欧美三级| 久久综合久中文字幕青草| 亚洲欧洲日韩综合| 亚洲成人短视频| 亚洲欧美另类小说| 麻豆久久久9性大片| 91在线观看喷潮| 一本一道久久综合狠狠老精东影业| 日韩av影片在线观看| 一本岛在线视频| 丁香花高清在线观看完整版| 久久精品欧美一区二区三区不卡| 国产精品入口夜色视频大尺度 | 欧美亚洲三区| 免费成人在线视频观看| 影音先锋日韩有码| 国产成人精品一区二区三区在线观看 | 国产精品免费看片| 欧美成人午夜剧场免费观看| 国产精品久久不卡| 国产美女亚洲精品7777| 欧美一二三区视频| 99亚洲男女激情在线观看| 一区二区成人在线视频| 日韩精品电影网站| 天天干天天做天天操| 激情综合网av| 国产成人啪精品视频免费网| 亚洲一区二区91| 午夜影院欧美| 亚洲欧洲国产伦综合| 亚洲欧洲日韩综合| 成人短视频软件网站大全app| 日韩欧美亚洲范冰冰与中字| 日韩精品免费一区| 蜜桃视频网站在线观看| 成人h动漫精品一区二| 中文字幕在线视频久| 国产很黄免费观看久久| 国产精品久久久久久影视 | 精品国产九九九| 日本伊人色综合网| 青青草国产精品一区二区| 国产精品免费视频网站| 国产精品18久久久久久麻辣| 国产福利久久久| 亚洲国产精品久久久久蝴蝶传媒| 亚洲系列中文字幕| 亚洲国产精品无码久久久久高潮 | 欧美日本精品一区二区三区| 免费观看成人网| 欧美三区四区| 欧美在线999| 中文字幕国产传媒| 91福利精品在线观看| 色噜噜狠狠色综合欧洲selulu| 波多野结衣乳巨码无在线| 不卡专区在线| 婷婷综合另类小说色区| 久久免费视频3| 深夜在线视频| 日本高清成人免费播放| 欧美一级裸体视频| 久久精品黄色| 91精品国产综合久久精品app| 想看黄色一级片| 日韩视频1区| 精品免费日韩av| 麻豆国产精品一区| 真实原创一区二区影院| 在线电影av不卡网址| 任我爽在线视频| 欧美啪啪一区| 97超碰国产精品女人人人爽| 午夜婷婷在线观看| 日本欧美在线观看| 成人性生交大片免费看小说 | 播放一区二区| 91麻豆精品国产91久久久| 北条麻妃亚洲一区| 国产精品黄网站| 国产午夜精品美女视频明星a级| 91社区视频在线观看| 综合在线视频| 国产91对白在线播放| 欧美成人一区二区视频| 狠狠色丁香九九婷婷综合五月| 成人在线免费观看一区| 免费一级在线观看播放网址| 中文字幕一区在线观看| 人妻av无码专区| 日本一区二区三区视频在线| 91精品国产品国语在线不卡| 韩国三级hd两男一女| 精品九九在线| 欧美黑人一区二区三区| 在线观看亚洲黄色| 国产成人免费视频网站 | 欧美~级网站不卡| 奇米4444一区二区三区| 亚洲一级在线播放| 97超碰欧美中文字幕| 亚洲一区二区三区免费看| 成人免费高清观看| 欧美日韩国产高清一区二区| 国产视频久久久久久| 成人激情电影在线| 亚州成人av在线| 国产精品一区二区人人爽| 91影院在线免费观看| 黄色录像特级片| 欧美va视频| 亚洲国产高清自拍| 欧美老熟妇一区二区三区| 丝袜美腿亚洲一区| 国产精品日韩一区二区三区| 欧美成人二区| 一本久久综合亚洲鲁鲁五月天| 韩国一区二区在线播放| 成人激情在线| 国产999在线| 手机看片一区二区| 亚洲国产日产av| 国产探花在线观看视频| 日韩成人a**站| 日本aⅴ大伊香蕉精品视频| 亚洲欧美激情国产综合久久久| 国产精品丝袜黑色高跟| 免费在线观看毛片网站| 国产劲爆久久| 欧美激情在线狂野欧美精品| 国产乱淫av免费| 中文字幕av一区 二区| 成人在线观看黄| 婷婷综合电影| 97国产在线视频| 特级丰满少妇一级aaaa爱毛片| 亚洲精品欧美专区| 亚洲午夜激情影院| 91综合久久| 91人成网站www| 黄色网页在线看| 欧美一区二区三区在线看| 一级片黄色录像| 日av在线不卡| 亚洲日本理论电影| 亚洲精品自拍| 日韩视频在线观看免费| 亚洲中文字幕在线一区| 国产精品久久久久久户外露出| 999精品网站| 欧美码中文字幕在线| 国产精品久久久久久久久借妻| 国产精品麻豆一区二区三区 | 亚洲热在线视频| 午夜精品久久| 国产精品久久一区二区三区| 日韩黄色小视频| 国产视色精品亚洲一区二区| 九色91在线| 亚洲精品一区二区三区精华液 | 性生交大片免费看l| 一本一道久久a久久精品蜜桃| 91日本视频在线| 欧美卡一卡二| 亚洲精品久久久久中文字幕二区| 一级片中文字幕| 久久久777精品电影网影网| 亚洲少妇第一页| 天天做天天爱天天综合网2021| 91精品在线看| 9999在线视频| 国产亚洲成精品久久| 在线观看中文字幕2021| 亚洲精品免费视频| 亚洲av无码一区二区二三区| 青青草97国产精品免费观看| 国产成人三级视频| 人人精品亚洲| 91精品国产乱码久久久张津瑜| 人人超碰91尤物精品国产| 一区二区冒白浆视频| 国产人与zoxxxx另类91| 国语自产精品视频在线看| 精品三级久久久久久久电影聊斋| 欧美日韩国产综合久久 | 香蕉av一区二区三区| 欧美在线影院一区二区| 久久视频免费看| 国产丝袜美腿一区二区三区| 三日本三级少妇三级99| 国产日韩综合| 手机福利在线视频| 亚州精品视频| 91在线精品视频| www.成人影院| 欧美精品在线视频观看| 国产免费av高清在线| 欧美成人精品福利| 中文字幕网址在线| 丰满岳妇乱一区二区三区| 久久嫩草捆绑紧缚| 久久综合丝袜日本网| 中文字幕一区二区三区四| 美女久久一区| 国产精品久久久久久久久电影网| 国产中文字幕一区二区三区| 大波视频国产精品久久| 久久天天久久| 日本成人精品在线| 国产蜜臀一区二区打屁股调教| 亚洲最新中文字幕| 凸凹人妻人人澡人人添| 91精品国产色综合久久不卡电影| 黄色污污网站在线观看| 亚洲一区二区精品3399| 国产美女久久久久久| 久久久99免费| 三级黄色片网站| 国产99久久久久久免费看农村| 天天干天天操天天玩| 久久国产毛片| 日韩在线视频在线观看| 国产精品av久久久久久麻豆网| 亚洲一区在线免费| 日韩成人a**站| 先锋影音一区二区三区| 精品一区在线| 日本成人三级| 亚洲a级精品| 久久综合九色欧美狠狠| 黑人久久a级毛片免费观看| 999视频在线观看| 亚洲精品成人一区| 国产在线拍偷自揄拍精品| 777午夜精品电影免费看| 日韩免费观看av| 欧美舌奴丨vk视频| 欧洲一区二区视频| 国产高清不卡| 国产成人精品日本亚洲专区61| 超级碰碰久久| 日本午夜在线亚洲.国产| 在线日韩影院| 国产mv久久久| 激情久久99| 国产专区精品视频| 99re8精品视频在线观看| 亚洲自拍欧美另类| 24小时成人在线视频| 91香蕉国产在线观看| 国产精品久久久久久久久久辛辛 | blacked蜜桃精品一区| 日韩精品成人一区二区在线观看| 精品美女在线视频| 中国人体摄影一区二区三区| 天天做综合网| 国产高清www| 国产午夜久久| 国产又大又黄又粗的视频| 蜜桃视频一区二区三区在线观看 | 美女又爽又黄免费视频| 在线观看91精品国产入口| 久久久久久av无码免费看大片| 欧美日韩在线直播| 国产av无码专区亚洲av麻豆| 日韩亚洲欧美在线观看| 人妻无码中文字幕免费视频蜜桃| 亚洲精品www久久久| 九色网友自拍视频手机在线| 中文字幕欧美精品在线 | 国产在线视频91| 韩国av电影在线观看| 精品久久久久久久久久久久久久久 | 亚洲人www| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 麻豆成人久久精品二区三区红| 97超碰人人看| 久久久综合精品| 91杏吧porn蝌蚪| 福利视频导航一区| 亚洲熟女乱色一区二区三区久久久| 欧美一区二区三区男人的天堂| 欧美 中文字幕| 最近2019年好看中文字幕视频| 在线看三级电影| 日韩免费在线看| 日韩视频在线直播| 日本一区二区三区四区在线观看 | 亚洲欧美日韩中文播放| 国产情侣在线视频| 欧美伦理视频网站| 无码精品视频一区二区三区| 色偷偷偷综合中文字幕;dd| 超碰在线最新网址| 国产欧美日韩免费看aⅴ视频| 国产精品99久久免费观看| 一区二区三区四区在线视频| 亚洲日本激情| gogo亚洲国模私拍人体| 日本一区二区成人在线| 亚洲国产综合久久| 91麻豆精品91久久久久同性| 日韩二区三区| 欧美激情第1页| 国产v日韩v欧美v| 国产一区二区在线免费| 九九久久婷婷| 国产精品久久久久久久午夜片| 欧美成人片在线观看| 色妞www精品视频| 手机看片一区二区三区| 久久精品成人欧美大片| 亚洲成人短视频| 国产精品一区二区你懂得| 欧美理论视频| 久久久免费视频网站| 国产成人综合网站| 一色道久久88加勒比一| 亚洲国产成人av网| 国产剧情精品在线| 一区二区三区日韩在线| 17videosex性欧美| 99久久精品无码一区二区毛片 | 欧美一级淫片007| 日本中文字幕视频在线| 欧美在线不卡区| 青青草原在线亚洲| 福利视频一二区| 成人一级片网址| 日韩一级片av| 欧美日韩国产经典色站一区二区三区| 国产黄色在线| 日本国产高清不卡| 一区二区三区日本久久久| 97中文字幕在线| 国产毛片精品视频| 粉嫩av性色av蜜臀av网站| 欧美日产国产精品| 久久五月精品| 国产欧美日韩视频| 午夜精品一区二区三区国产| 五月激情五月婷婷| 国产精品久久久久婷婷| 一区二区三区免费在线| 永久免费精品影视网站| 欧美综合社区国产| 亚洲精品久久区二区三区蜜桃臀| 亚洲成人直播| 水蜜桃av无码| 欧美日韩亚洲天堂| 国产午夜精品一区理论片| 日本电影亚洲天堂| 日韩电影不卡一区| 日本免费不卡一区二区| 91在线码无精品| 欧美男人天堂网| 在线免费观看羞羞视频一区二区| 国外成人福利视频| 亚洲视频小说| 国产精品一区一区三区| 极品久久久久久| 日韩片之四级片| 色网在线免费观看| 欧美深深色噜噜狠狠yyy| 男女视频一区二区| 肉色超薄丝袜脚交69xx图片 | 亚洲午夜精品久久久久久久久| 国产精品国产三级国产普通话对白| 欧美高清第一页| 欧美wwwwww| www.超碰com| 日韩限制级电影在线观看| 国产情侣自拍av| 亚洲国产精品一区二区久| 好吊日av在线| 欧洲一区二区在线观看| 丝袜a∨在线一区二区三区不卡| 国产精品久久久久久久av| 欧美日韩国产综合一区二区| 色网站免费在线观看| 国产欧美日本在线| 免费视频一区二区三区在线观看| 自拍偷拍你懂的| 日韩你懂的在线观看| 黄色aa久久| 懂色av粉嫩av蜜臀av| 国产超碰在线一区| 自拍偷拍福利视频| 久久精品99久久久香蕉| 欧美人与拘性视交免费看| 91插插插插插插插插| 偷拍日韩校园综合在线| yw193.com尤物在线| 国产精品加勒比| 久久精品av麻豆的观看方式| 久久久久无码国产精品|