国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|

服務器之家 - 編程語言 - JAVA教程 - String長度有限制嗎?是多少?

String長度有限制嗎?是多少?

2020-11-10 23:02今日頭條GoKu編程 JAVA教程

話說Java中String是有長度限制的,聽到這里很多人不禁要問,String還有長度限制?是的有,而且在JVM編譯中還有規范,而且有的家人們在面試的時候也遇到了,本人就遇到過面試的時候問這個的。

前言

話說Java中String是有長度限制的,聽到這里很多人不禁要問,String還有長度限制?是的有,而且在JVM編譯中還有規范,而且有的家人們在面試的時候也遇到了,本人就遇到過面試的時候問這個的,而且在之前開發的中也真實地遇到過這個String長度限制的場景(將某固定文件轉碼成Base64的形式用字符串存儲,在運行時需要的時候在轉回來,當時文件比較大),那這個規范限制到底是怎么樣的,咱們話不多說先去。

String

首先要知道String的長度限制我們就需要知道String是怎么存儲字符串的,String其實是使用的一個char類型的數組來存儲字符串中的字符的。

String長度有限制嗎?是多少?
存儲String的容器原來是它

那么String既然是數組存儲那數組會有長度的限制嗎?是的有限制,但是是在有先提條件下的,我們看看String中返回length的方法。

String長度有限制嗎?是多少?
String類中的length方法

由此我們看到返回值類型是int類型,Java中定義數組是可以給數組指定長度的,當然不指定的話默認會根據數組元素來指定:

  • int[] arr1 = new int[10]; // 定義一個長度為10的數組
  • int[] arr2 = {1,2,3,4,5}; // 那么此時數組的長度為5

整數在java中是有限制的,我們通過源碼來看看int類型對應的包裝類Integer可以看到,其長度最大限制為2^31 -1,那么說明了數組的長度是0~2^31-1,那么計算一下就是(2^31-1 = 2147483647 = 4GB)

String長度有限制嗎?是多少?
Integer的取值范圍

看到這我們嘗試通過編碼來驗證一下上述觀點。

String長度有限制嗎?是多少?
以字面量形式定義字符串

以上是我通過定義字面量的形式構造的10萬個字符的字符串,編譯之后虛擬機提示報錯,說我們的字符串長度過長,不是說好了可以存21億個嗎?為什么才10萬個就報錯了呢?

其實這里涉及到了JVM編譯規范的限制了,其實JVM在編譯時,如果我們將字符串定義成了字面量的形式,編譯時JVM是會將其存放在常量池中,這時候JVM對這個常量池存儲String類型做出了限制,接下來我們先看下手冊是如何說的。

String長度有限制嗎?是多少?
java虛擬機規范截圖

常量池中,每個 cp_info 項的格式必須相同,它們都以一個表示 cp_info 類型的單字節 “tag”項開頭。后面 info[]項的內容 由tag 的類型所決定。

String長度有限制嗎?是多少?
java虛擬機規范手冊常量類型表

我們可以看到 String類型的表示是 CONSTANT_String ,我們來看下CONSTANT_String具體是如何定義的。

String長度有限制嗎?是多少?

這里定義的 u2 string_index 表示的是常量池的有效索引,其類型是CONSTANT_Utf8_info 結構體表示的,這里我們需要注意的是其中定義的length我們看下面這張圖。

String長度有限制嗎?是多少?

在class文件中u2表示的是無符號數占2個字節單位,我們知道1個字節占8位,2個字節就是16位 ,那么2個字節能表示的范圍就是2^16- 1 = 65535 。范中class文件格式對u1、u2的定義的解釋做了一下摘要:

這里對java虛擬機規摘要部分

1、class文件中文件內容類型解釋

  • 定義一組私有數據類型來表示 Class 文件的內容,它們包括 u1,u2 和 u4,分別代表了 1、2 和 4 個字節的無符號數。
  • 每個 Class 文件都是由 8 字節為單位的字節流組成,所有的 16 位、32 位和 64 位長度的數據將被構造成 2 個、4 個和 8 個 8 字節單位來表示。

2、程序異常處理的有效范圍解釋

  • start_pc 和 end_pc 兩項的值表明了異常處理器在 code[]數組中的有效范圍。
  • start_pc 必須是對當前 code[]數組中某一指令的操作碼的有效索引,end_pc 要么是對當前 code[]數組中某一指令的操作碼的有效索引,要么等于 code_length的值,即當前 code[]數組的長度。start_pc 的值必須比 end_pc 小。
  • 當程序計數器在范圍[start_pc, end_pc)內時,異常處理器就將生效。即設 x 為異常句柄的有效范圍內的值,x 滿足:start_pc ≤ x < end_pc。
  • 實際上,end_pc 值本身不屬于異常處理器的有效范圍這點屬于 Java 虛擬機歷史上的一個設計缺陷:如果 Java 虛擬機中的一個方法的 code 屬性的長度剛好是 65535個字節,并且以一個 1 個字節長度的指令結束,那么這條指令將不能被異常處理器所處理。不過編譯器可以通過限制任何方法、實例初始化方法或類初始化方法的code[]數組最大長度為 65534,這樣可以間接彌補這個 BUG。

注意:這里對個人認為比較重要的點做了標記,首先第一個加粗說白了就是說數組有效范圍就是【0-65565】但是第二個加粗的地方又解釋了,因為虛擬機還需要1個字節的指令作為結束,所以其實真正的有效范圍是【0-65564】,這里要注意這里的范圍僅限編譯時期,如果你是運行時拼接的字符串是可以超出這個范圍的。

接下來我們通過一個小實驗來測試一下我們構建一個長度為65534的字符串,看看是否就能編譯通過。

首先通過一個for循環構建65534長度的字符串,在控制臺打印后,我們通過自己度娘的一個在線字符統計工具計算了一下確實是65534個字符,如下:

String長度有限制嗎?是多少?
String長度有限制嗎?是多少?

然后我們將字符復制后以定義字面量的形式賦值給字符串,可以看到我們選擇這些字符右下角顯示的確實是65534,于是乎運行了一波,果然成功了。

String長度有限制嗎?是多少?
String長度有限制嗎?是多少?

看到這里我們來總結一下:

問:字符串有長度限制嗎?是多少?

答:首先字符串的內容是由一個字符數組 char[] 來存儲的,由于數組的長度及索引是整數,且String類中返回字符串長度的方法length() 的返回值也是int ,所以通過查看java源碼中的類Integer我們可以看到Integer的最大范圍是2^31 -1,由于數組是從0開始的,所以數組的最大長度可以使【0~2^31-1】通過計算是大概4GB。

但是通過翻閱java虛擬機手冊對class文件格式的定義以及常量池中對String類型的結構體定義我們可以知道對于索引定義了u2,就是無符號占2個字節,2個字節可以表示的最大范圍是2^16 -1 = 65535。

其實是65535,但是由于JVM需要1個字節表示結束指令,所以這個范圍就為65534了。超出這個范圍在編譯時期是會報錯的,但是運行時拼接或者賦值的話范圍是在整形的最大范圍。

解析到這里就告一段落了,如果覺得在下講得對你有幫助的可以點一波關注,下方的小拇指點一波支持,如果發現有講的不好的或者有什么遺漏的,歡迎評論區留言相互學習,進步,后期會不定期更新更多的技術編程相關的文章。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲xxxxx| 国产精品毛片久久久久久久明星 | 免费激情网站 | 中文字幕综合在线 | 国产三区在线视频 | 91麻豆精品国产91久久久久久 | 日韩中文字幕视频在线观看 | 日韩成人中文字幕 | 午夜精品一区二区三区免费视频 | 91av影院| 国产一区二区三区在线观看视频 | 亚洲欧美成人综合 | 精品国产一区二区三区日日嗨 | 隔壁老王国产在线精品 | 欧美激情亚洲 | 狠狠干最新网址 | 亚洲va国产天堂va久久 en | 久久久在线 | 国产精品亚洲一区 | 亚洲专区欧美 | 中文字幕亚洲欧美 | 希岛爱理一区二区三区av高清 | 欧美日韩中文 | 国产精品不卡视频 | 国产精品不卡一区 | 中文字幕在线影院 | 久久精品一二三四 | 国产精品久久久久久婷婷天堂 | 久久99国产精品 | 国产成人精品网站 | jizzzz中国| 国产精品久久久久久久久久新婚 | 毛片黄片免费观看 | 黄色国产一级片 | 四虎影视4hu4虎成人 | 欧美日韩欧美日韩 | 成人免费aaa | 日韩男女视频 | 亚洲精品欧洲精品 | 成人精品视频 | 欧美精品亚洲精品日韩精品 |