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

String最大長度是多少?涉及知識面太多,不要錯過!

開發 前端
當你看到這個問題“String長度限制是多少”時是不是感覺很無聊?的確,這就是我第一眼看到時的感覺。

[[397376]]

本文轉載自微信公眾號「程序新視界」,作者二師兄。轉載本文請聯系程序新視界公眾號。  

前言

當你看到這個問題“String長度限制是多少”時是不是感覺很無聊?的確,這就是我第一眼看到時的感覺。

但當深入追蹤該問題時,才發現String的長度限制本身的意義并不重要,重要的是在此過程中會將大量知識點串聯起來,簡直是一個完美的問題。難怪在高階段的面試中會出現類似的問題。

本篇文章就來帶大家追尋String長度的限制,需要提醒讀者的是,結論并不重要,重要的是分析的過程,以及涉及到的知識儲備。比如,String的底層實現、int類型的范圍、《Java虛擬機規范》、Java編譯器源碼實現等大量知識點。

String源碼追蹤

要看String類的長度限制,肯定要先從String的源碼實現看起,這里就以目前使用最多的JDK8為例來進行說明。JDK9及以后String的底層實現有所變化,大家可參考《JDK9對String字符串的新一輪優化》一文。

我們都知道,String類提供了一個length方法,我們是否可以直接通過這個方法得知String的最大長度?

  1. /** 
  2.  * Returns the length of this string. 
  3.  * The length is equal to the number of <a href="Character.html#unicode">Unicode 
  4.  * code units</a> in the string. 
  5.  * 
  6.  * @return  the length of the sequence of characters represented by this 
  7.  *          object. 
  8.  */ 
  9. public int length() { 
  10.     return value.length; 

這里文檔并沒有說明最大長度是多少,但我們可以從返回的結果類型得知一些線索。結果類型為int,也就是說int的取值范圍便是限制之一。

如果你知道int在正整數部分的取值范圍為2^31 -1那很好,如果不知道,可以查看對應的包裝類Integer:

  1. public final class Integer extends Number implements Comparable<Integer> { 
  2.     /** 
  3.      * A constant holding the minimum value an {@code int} can 
  4.      * have, -2<sup>31</sup>. 
  5.      */ 
  6.     @Native public static final int   MIN_VALUE = 0x80000000; 
  7.  
  8.     /** 
  9.      * A constant holding the maximum value an {@code int} can 
  10.      * have, 2<sup>31</sup>-1. 
  11.      */ 
  12.     @Native public static final int   MAX_VALUE = 0x7fffffff; 
  13.     // ... 

無論MIN_VALUE和MAX_VALUE的值或注釋都說明了int的取值范圍。此時計算一下String的最大長度應該是:

  1. 2^31 - 1 = 2147483647 

回到length方法,我們看到length的值是通過是value獲得的,而value在JDK8中是以char數組實現的:

  1. public final class String 
  2.     implements java.io.Serializable, Comparable<String>, CharSequence { 
  3.     /** The value is used for character storage. */ 
  4.     private final char value[]; 
  5.     // ...    

Java中內碼(運行內存)中的char使用UTF16的方式編碼,一個char占用兩個字節。所以,還需要從將上面計算的值乘以2。

此時的計算公式為:

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

也就是說最大字符串占用內存空間約等于4GB。但此時,如果你聲明一個長度為10萬的字符串,你會發現編譯器會拋出異常,提示信息如下:

錯誤: 常量字符串過長

不是說好的21億嗎?怎么10萬個就異常了呢?其實這個異常是由編譯期的限制決定的。

字符串常量池的編譯期限制

了解過JVM虛擬機的朋友肯定知道,當通過字面量進行字符串聲明時,在編譯之后會以常量的形式進入到Class常量池。

  1. String s = "程序新視界"

而常量池對String的長度是有限制的。常量池中的每一種數據項都有自己的類型。Java中的UTF-8編碼的Unicode字符串在常量池中以CONSTANT_Utf8類型表示。

在《Java虛擬機規范》中可以看到對String是通過CONSTANT_String_info來定義的。

可以看到“string_index項的值必須是對常量池的有效索引,常量池在該索引處的項必須是CONSTANT_Utf8_info(§4.4.7)結構”。

繼續看對CONSTANT_Utf8_info的定義:

length則指明了bytes[]數組的長度,類型為u2。同樣是在《Java虛擬機規范》中可以找到對u2的定義:

u2表示兩個字節的無符號數,1個字節有8位,2個字節就有16位。因此,u2可表示的最大值為2^16 - 1= 65535。

到這里,已經得出了第二個限制,也就是Class文件中常量池的格式規定了,其字符串常量的長度不能超過65535。

此時,如果嘗試通過字面量聲明一個65535長度的字符串:

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

編譯器還會拋出同樣的異常。這又是為什么呢?

這個問題我們同樣可以從《Java虛擬機規范》(4.7.3節)中找到答案:

原來是為了彌補早期設計時的一個bug,“長度剛好65535個字節,且以1個字節長度的指令結束,這條指令不能被異常處理器處理”,因此就將數組的最大長度限制到了65534了。

如果你能夠查看JVM中編譯器部分的源碼,可以在Gen類中看到對此限制的代碼實現:

  1. /** Check a constant value and report if it is a string that is 
  2.  *  too large. 
  3.  */ 
  4. private void checkStringConstant(DiagnosticPosition pos, Object constValue) { 
  5.     if (nerrs != 0 || // only complain about a long string once 
  6.         constValue == null || 
  7.         !(constValue instanceof String) || 
  8.         ((String)constValue).length() < Pool.MAX_STRING_LENGTH) 
  9.         return
  10.     log.error(pos, "limit.string"); 
  11.     nerrs++; 

其中Pool.MAX_STRING_LENGTH的定義如下:

  1. public class Pool { 
  2.     public static final int MAX_STRING_LENGTH = 0xFFFF; 
  3.     //... 

再次嘗試聲明一個長度為65534的字符串,會發現可以正常編譯了。此時,可以得出結論,在編譯期字符串的最大長度為65534。

我們知道,Java是區分編譯期和運行期的,那么在運行期是否有長度限制呢?

運行期的長度限制

String運行期的限制主要體現在String的構造函數上。String的一個構造函數如下:

  1. public String(char value[], int offset, int count) { 
  2.    // ... 

其中參數count就是字符串的最大長度。此時的計算與前面的算法一致,這里先轉換為bit,然后再轉換為GB:

  1. (2^31-1)*16/8/1024/1024/1024 = 4GB 

也就是說,運行時理論上可以支持4GB大小的字符串,超過這個限制就會拋出異常的。JDK9對String的存儲進行了優化,底層使用byte數組替代了char數組,對于純Latin1字符來說可以節省一半的空間。

當然,這個4GB的限制是基于JVM能夠分配這么多可用的內存的前提下的。

小結

通過上述的分析,可以得出結論:第一,在編譯期字符串的長度不能超過65534;第二,在運行期,字符串的長度不能超過2^31-1,占用內存(4GB)不能超過虛擬機所分配的最大內存。

 

結論很簡單,但本篇文章分析時所使用的知識和思路你學到了嗎?如果沒有,趕緊補一補吧。

 

責任編輯:武曉燕 來源: 程序新視界
相關推薦

2020-11-10 13:47:29

String源碼長度限制

2022-02-17 10:56:33

Redis數據系統

2009-12-15 17:19:23

架構師梁遠華聚聚呀

2020-06-15 08:25:35

Linux 系統 數據

2021-11-07 07:51:01

JavaString字符串

2022-05-20 15:27:41

React工具Vue

2011-06-23 08:50:46

JavaAndroidOracle

2020-12-16 15:37:19

Python編程語言開發

2023-04-11 16:31:10

開發React 庫Web

2010-10-08 14:45:43

mysql中int

2020-07-21 08:14:13

TypeScrip

2013-05-31 15:57:59

Windows 8.1

2021-10-08 08:00:00

Java開發功能

2020-07-09 07:37:06

數據庫Redis工具

2023-08-11 08:19:39

JavaStream API

2020-08-17 17:22:34

VSCode插件開發編碼

2020-11-17 16:22:45

開源工具報表

2021-03-08 21:57:29

手機科技數碼

2020-08-18 11:21:28

數據挖掘機器學習算法
點贊
收藏

51CTO技術棧公眾號

国产欧美日韩在线| 久久三级福利| 精品国产一区二区亚洲人成毛片| 国产女教师bbwbbwbbw| 欧日韩在线视频| 久久精品女人天堂| 色一情一乱一区二区| 久久av一区二区三| 蜜臀国产一区| 亚洲女人小视频在线观看| 国产欧美韩日| 在线视频 91| 欧美日韩1080p| 亚洲精品在线观看www| 欧美成年人视频在线观看| 日韩精品亚洲人成在线观看| 久久色在线观看| 91亚洲精品视频| 午夜婷婷在线观看| 综合久久精品| 在线中文字幕日韩| 国产吃瓜黑料一区二区| 日本综合久久| 一区二区日韩av| 亚洲国产午夜伦理片大全在线观看网站| 国产夫妻在线观看| 日本免费在线视频不卡一不卡二| 欧美黑人xxxⅹ高潮交| 日本爱爱爱视频| 欧美成a人免费观看久久| 欧美男女性生活在线直播观看| 国产精品久久久久7777| 麻豆av在线免费看| 欧美国产欧美综合| 久久爱av电影| 免费观看a视频| 黄色资源网久久资源365| 日韩暖暖在线视频| 久久久久久久久久免费视频| 欧美私人啪啪vps| 久久香蕉国产线看观看av| 欧洲美熟女乱又伦| 精品99久久| 国产一区二区福利| 国产成人精品综合久久久| 亚洲午夜久久久久久久久| 成人久久网站| 91国产福利在线| 男人天堂1024| 都市激情国产精品| 亚洲一区二区av在线| 国产日韩视频在线播放| 91高清在线视频| 国产欧美日韩另类一区| 欧美一区二视频在线免费观看| 欧美一级片免费| 成人永久免费视频| 国产精品久久久久久久免费大片 | 色88888久久久久久影院野外| 阿v天堂2018| 国产网红女主播精品视频| 亚洲一卡二卡三卡四卡| 日韩成人三级视频| 在线观看操人| 亚洲综合色网站| 欧美一级视频免费看| www.youjizz.com在线| 精品国产91久久久久久老师| 日本在线xxx| 综合久久2023| 欧美日韩国产另类不卡| 天天色天天综合网| 亚洲图色一区二区三区| 精品国产一区久久| 欧美老熟妇乱大交xxxxx| 精品国产视频| 久久综合久久美利坚合众国| tube国产麻豆| 日韩一级大片| 国产精品对白刺激| 国产乱码精品一区二三区蜜臂 | 九色在线免费| 国产精品嫩草影院av蜜臀| 永久久久久久| 成年女人在线看片| 在线观看免费一区| www.国产福利| 奇米影视777在线欧美电影观看| 亚洲理论在线a中文字幕| 日韩免费成人av| 在线电影一区二区| 91国内在线视频| 综合久久中文字幕| 国产成人精品一区二 | 波多野结衣一区| 美女精品久久久| 青青操免费在线视频| 蜜桃久久久久久| 官网99热精品| 成人在线播放视频| 亚洲自拍欧美精品| 日本男人操女人| caopo在线| 亚洲午夜久久久久久久久电影院| 激情网站五月天| 国产一区二区三区精品在线观看| 日韩电影第一页| 91狠狠综合久久久| 午夜一区不卡| 国产做受高潮69| 国产精品乱码一区二区视频| 国产精品综合网| 日韩欧美电影一区二区| 国产精品一品| 337p亚洲精品色噜噜| 国产偷人妻精品一区| 外国成人免费视频| 日韩av第一页| 亚洲精品成av人片天堂无码| av在线播放天堂| 久久精品免费在线| 日本伊人精品一区二区三区观看方式| 91天堂在线观看| 国产黄色片在线观看| 亚洲午夜国产一区99re久久| 国产美女18xxxx免费视频| 欧美在线导航| 久久6免费高清热精品| 免费视频网站在线观看入口| 不卡一区中文字幕| 伊人再见免费在线观看高清版| 国产综合色区在线观看| 日韩精品免费在线视频观看| 中文字幕影音先锋| 九九**精品视频免费播放| 日本不卡一区二区三区视频| 9999热视频在线观看| 日韩免费视频线观看| 欧美日韩黄色一级片| 视频精品二区| 久久亚洲精品国产亚洲老地址| 波多野结衣电车| 久久久久国产精品麻豆| 国产精品丝袜久久久久久消防器材| 久久wwww| 草民午夜欧美限制a级福利片| 99精品人妻国产毛片| 91玉足脚交白嫩脚丫在线播放| 国产精品自拍合集| 久久99成人| 免费91在线视频| 国产美女主播在线观看| 亚洲欧洲精品一区二区三区| www.超碰97.com| 色中色综合网| 91亚洲精品一区| 日韩三级免费| 亚洲电影免费观看高清完整版在线观看 | www三级免费| 亚洲婷婷综合色高清在线| 九九精品久久久| 久久久久久久久丰满| 91中文字幕一区| 视频在线这里都是精品| 精品88久久久久88久久久| 日本特黄特色aaa大片免费| 99久久精品国产导航| 日韩人妻精品无码一区二区三区| 亚洲国产欧美日韩在线观看第一区 | 又爽又大又黄a级毛片在线视频| 欧日韩精品视频| 99鲁鲁精品一区二区三区| 国产福利电影一区二区三区| 国产xxxx振车| 亚洲人成网亚洲欧洲无码| 国产精品高潮呻吟久久av野狼 | 欧美国产第一页| 少妇av一区二区| 色国产综合视频| 2014亚洲天堂| 波多野结衣在线一区| aa免费在线观看| 99蜜月精品久久91| 久久精品久久久久电影| 亚洲av无码乱码国产麻豆| 午夜一区二区三区在线观看| www.中文字幕av| 精品一二三四在线| 日韩黄色短视频| 精品美女久久| 97在线电影| 欧美日韩电影免费看| 久久天天躁夜夜躁狠狠躁2022| 亚洲精品97久久中文字幕无码| 色婷婷国产精品| 逼特逼视频在线观看| 国产日韩欧美高清免费| 亚洲.欧美.日本.国产综合在线| 18video性欧美19sex高清| 日韩国产在线播放| 91国偷自产中文字幕久久| 亚洲影视在线观看| 一级黄色录像毛片| 成人一区二区三区视频| 99热手机在线| 一区二区亚洲| 新呦u视频一区二区| 成人h动漫精品一区二区器材| 国产精品国产福利国产秒拍| 性xxxfreexxxx性欧美| 亚洲亚裔videos黑人hd| 亚洲黄色在线播放| 欧美日韩国产免费一区二区| 欧美三级韩国三级日本三斤在线观看| 中文字幕一区二区5566日韩| 天堂久久久久久| 国产剧情一区在线| 亚洲天堂网一区| 在线视频免费在线观看一区二区| www.午夜色| 欧美人与牛zoz0性行为| 国产伦精品一区二区三区免 | 91久久久久久| 日韩av超清在线观看| 性欧美xxxx| 自拍视频在线免费观看| 亚洲视频精品在线| 视频三区在线观看| 亚洲成人中文字幕| 国产女人高潮毛片| 欧美精品久久天天躁| 波多野结衣一区二区三区四区| 五月婷婷色综合| 欧美xxxx黑人xyx性爽| 国产精品福利一区二区三区| 美女被到爽高潮视频| 91美女蜜桃在线| 欧类av怡春院| 不卡的av电影| 北京富婆泄欲对白| 成人毛片老司机大片| 农村末发育av片一区二区| 国产伦精一区二区三区| 日日干日日操日日射| 美女高潮久久久| 国产三级日本三级在线播放| 免费欧美日韩| 青青草原成人网| 国产日韩欧美三级| 1024精品视频| 石原莉奈在线亚洲二区| wwwxxx黄色片| 首页亚洲欧美制服丝腿| 久久精品香蕉视频| 蜜臀av一区二区| 17c国产在线| 国产一区二区网址| 日本黄色三级网站| 国产成人鲁色资源国产91色综| 精品人妻一区二区三| 国产成人精品影视| 欧美肉大捧一进一出免费视频| 99国产一区二区三精品乱码| 在线精品一区二区三区| 久久夜色精品国产噜噜av| 熟女少妇内射日韩亚洲| 国产精品理伦片| 加勒比婷婷色综合久久| 亚洲一二三区视频在线观看| 日本特黄特色aaa大片免费| 欧美午夜无遮挡| 最新中文字幕第一页| 欧美丰满少妇xxxxx高潮对白| www.黄色片| 精品偷拍各种wc美女嘘嘘| www.av在线| 久久69精品久久久久久国产越南| 欧美a级在线观看| 国产精品一香蕉国产线看观看| 亚洲91在线| 国产日韩一区欧美| 奇米色欧美一区二区三区| 一区二区三区四区| 欧美日韩国产精品一区二区亚洲| 久久久一本二本三本| 日韩成人午夜精品| 亚洲一区二区三区三州| 91免费观看国产| 中国一级片在线观看| 亚洲一二三四久久| 正在播放木下凛凛xv99| 日韩亚洲欧美一区| 欧美在线观看在线观看| 久久久国产91| 三妻四妾完整版在线观看电视剧 | 亚洲一品av免费观看| 大地资源网3页在线观看| 97av在线视频免费播放| 123成人网| 久久99精品久久久久久三级| 色综合咪咪久久网| 成人在线免费在线观看| 国产激情偷乱视频一区二区三区| www在线观看免费视频| 伊人性伊人情综合网| 欧美性受xxx黑人xyx性爽| 精品国产一区a| 精品国产丝袜高跟鞋| 国产成人黄色av| 成人知道污网站| 宅男一区二区三区| 久久精品1区| 97中文字幕在线观看| 国产精品乱人伦中文| 国产成人无码av| 亚洲精品国产精品国自产观看浪潮 | 国产成人免费视| 蜜桃视频最新网址| 91亚洲国产成人精品一区二三| 五月天免费网站| 色综合网色综合| 男人天堂手机在线观看| 久久精品中文字幕电影| se01亚洲视频| 精品无人乱码一区二区三区的优势 | 日本aⅴ免费视频一区二区三区| 中文字幕第九页| 亚洲激情av在线| 国产精品久久影视| 深夜福利亚洲导航| 国产精品天堂蜜av在线播放 | 青青操视频在线| 国模gogo一区二区大胆私拍| 亚洲五码在线| 国产免费xxx| 国产一区二区h| 亚洲不卡在线播放| 欧美日韩精品一区视频| 成人精品一区| 国产精品久久久久久av| 国产亚洲一区二区三区啪| 少妇高潮喷水久久久久久久久久| 成人h精品动漫一区二区三区| 美女视频黄免费| 日韩欧美亚洲国产精品字幕久久久 | 成人综合激情网| 日本少妇做爰全过程毛片| 精品国产乱码久久久久久闺蜜 | 国产成人精品视| 狠狠色狠狠色综合婷婷tag| 欧美国产日韩在线播放| 国产欧美一区二区在线| 精人妻无码一区二区三区| 亚洲性日韩精品一区二区| 午夜无码国产理论在线| 日韩在线三区| 久久国产精品第一页| 91精品一区二区三区蜜桃| 欧美一区二区三区在线观看| dy888亚洲精品一区二区三区| 99精彩视频| 国内精品久久久久国产盗摄免费观看完整版 | 色欲综合视频天天天| 男人天堂网在线| 国产精品青草久久久久福利99| 日韩欧美不卡| 午夜大片在线观看| 亚洲午夜精品在线| 你懂的在线播放| 国产男人精品视频| 欧美日本二区| 四虎永久免费影院| 欧美网站一区二区| 黄色网在线看| 国产精品久久久久久久久久久久午夜片| 99在线|亚洲一区二区| 88久久精品无码一区二区毛片| 欧美午夜免费电影| 羞羞污视频在线观看| 久久亚洲一区二区| 麻豆视频一区二区| 久久久久久久伊人| 国产亚洲激情在线| 亚洲高清999| 免费看a级黄色片| 一区二区在线观看视频在线观看| 少妇荡乳情欲办公室456视频| 国产精品极品在线| 欧美粗暴jizz性欧美20| 性欧美成人播放77777| 欧美日韩精品电影| 超碰激情在线| 自拍视频一区二区三区| 成人黄色小视频在线观看| 中文字幕无码乱码人妻日韩精品| 欧美大片免费观看| 俺要去色综合狠狠| 欧类av怡春院| 欧美一级午夜免费电影| 欧美人与性动交xxⅹxx|