久久综合九色综合97婷婷-美女视频黄频a免费-精品日本一区二区三区在线观看-日韩中文无码有码免费视频-亚洲中文字幕无码专区-扒开双腿疯狂进出爽爽爽动态照片-国产乱理伦片在线观看夜-高清极品美女毛茸茸-欧美寡妇性猛交XXX-国产亚洲精品99在线播放-日韩美女毛片又爽又大毛片,99久久久无码国产精品9,国产成a人片在线观看视频下载,欧美疯狂xxxx吞精视频

有趣生活

當(dāng)前位置:首頁>職場>string類型有沒有長度限制(懵了面試官問我)

string類型有沒有長度限制(懵了面試官問我)

發(fā)布時間:2024-01-24閱讀(12)

導(dǎo)讀★★★建議星標(biāo)我們★★★2020年Java原創(chuàng)面試題庫連載中【000期】Java最全面試題庫思維導(dǎo)圖【020期】JavaSE系列面試題匯總(共18篇)【02....

★★★建議星標(biāo)我們★★★

string類型有沒有長度限制(懵了面試官問我)(1)

string類型有沒有長度限制(懵了面試官問我)(2)

2020年Java原創(chuàng)面試題庫連載中

【000期】Java最全面試題庫思維導(dǎo)圖

【020期】JavaSE系列面試題匯總(共18篇)

【028期】JavaWeb系列面試題匯總(共10篇)

【042期】JavaEE系列面試題匯總(共13篇)

【049期】數(shù)據(jù)庫系列面試題匯總(共6篇)

【053期】中間件系列面試題匯總(共3篇)

【065期】數(shù)據(jù)結(jié)構(gòu)與算法面試題匯總(共11篇)

【076期】分布式面試題匯總(共10篇)

【100期】綜合面試題系列匯總(共23篇)

【151期】100-150期匯總(共50篇)

【152期】如何應(yīng)對高并發(fā)流量?

【153期】StringBuilder線程安全嗎?為什么?

【154期】Redis的過期鍵刪除策略有哪些?

【155期】Spring-Retry重試實現(xiàn)原理是什么?

【156期】數(shù)據(jù)庫分庫分表之后,如何解決事務(wù)問題?

【157期】為什么 SQL 語句不要過多的 join?

【158期】說說注冊中心 zookeeper 和 eureka 中的CP和 AP

【159期】Java中的finally一定會被執(zhí)行嗎?

更多內(nèi)容,點擊上方名片查看

string類型有沒有長度限制(懵了面試官問我)(3)

前言

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

本人就遇到過面試的時候問這個的,而且在之前開發(fā)的中也真實地遇到過這個 String 長度限制的場景(將某固定文件轉(zhuǎn)碼成 Base64 的形式用字符串存儲,在運行時需要的時候在轉(zhuǎn)回來,當(dāng)時文件比較大),那這個規(guī)范限制到底是怎么樣的,咱們話不多說先??去。

String

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

string類型有沒有長度限制(懵了面試官問我)(4)

存儲 String 的容器原來是它

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

string類型有沒有長度限制(懵了面試官問我)(5)

String 類中的 length 方法

由此我們看到返回值類型是 int 類型,Java 中定義數(shù)組是可以給數(shù)組指定長度的,當(dāng)然不指定的話默認(rèn)會根據(jù)數(shù)組元素來指定:

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

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

string類型有沒有長度限制(懵了面試官問我)(6)

Integer 的取值范圍

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

string類型有沒有長度限制(懵了面試官問我)(7)

以字面量形式定義字符串

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

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

string類型有沒有長度限制(懵了面試官問我)(8)

java 虛擬機規(guī)范截圖

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

string類型有沒有長度限制(懵了面試官問我)(9)

java 虛擬機規(guī)范手冊常量類型表

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

string類型有沒有長度限制(懵了面試官問我)(10)

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

string類型有沒有長度限制(懵了面試官問我)(11)

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

這里對 java 虛擬機規(guī)摘要部分

1、class 文件中文件內(nèi)容類型解釋

定義一組私有數(shù)據(jù)類型來表示 Class 文件的內(nèi)容,它們包括 u1,u2 和 u4,分別代 表了 1、2 和 4 個字節(jié)的無符號數(shù)。

每個 Class 文件都是由 8 字節(jié)為單位的字節(jié)流組成,所有的 16 位、32 位和 64 位長度的數(shù) 據(jù)將被構(gòu)造成 2 個、4 個和 8 個 8 字節(jié)單位來表示。

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

start_pc 和 end_pc 兩項的值表明了異常處理器在 code 數(shù)組中的有效范圍。

start_pc 必須是對當(dāng)前 code 數(shù)組中某一指令的操作碼的有效索引,end_pc 要 么是對當(dāng)前 code 數(shù)組中某一指令的操作碼的有效索引,要么等于 code_length 的值,即當(dāng)前 code 數(shù)組的長度。start_pc 的值必須比 end_pc 小。

當(dāng)程序計數(shù)器在范圍[start_pc, end_pc)內(nèi)時,異常處理器就將生效。即設(shè) x 為 異常句柄的有效范圍內(nèi)的值,x 滿足:start_pc ≤ x < end_pc

實際上,end_pc 值本身不屬于異常處理器的有效范圍這點屬于 Java 虛擬機歷史上 的一個設(shè)計缺陷:如果 Java 虛擬機中的一個方法的 code 屬性的長度剛好是 65535 個字節(jié),并且以一個 1 個字節(jié)長度的指令結(jié)束,那么這條指令將不能被異常處理器 所處理。

不過編譯器可以通過限制任何方法、實例初始化方法或類初始化方法的code數(shù)組最大長度為 65534,這樣可以間接彌補這個 BUG。

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

接下來我們通過一個小實驗來測試一下我們構(gòu)建一個長度為 65534 的字符串,看看是否就能編譯通過。0 期階段匯總

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

string類型有沒有長度限制(懵了面試官問我)(12)

string類型有沒有長度限制(懵了面試官問我)(13)

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

string類型有沒有長度限制(懵了面試官問我)(14)

string類型有沒有長度限制(懵了面試官問我)(15)

看到這里我們來總結(jié)一下:

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

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

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

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

來源:r6d.cn/Fmku

string類型有沒有長度限制(懵了面試官問我)(16)

之前,給大家發(fā)過三份Java面試寶典,這次新增了一份,目前總共是四份面試寶典,相信在跳槽前一個月按照面試寶典準(zhǔn)備準(zhǔn)備,基本沒大問題。

  • 《java面試寶典5.0》(初中級)

  • 《350道Java面試題:整理自100 公司》(中高級)

  • 《資深java面試寶典-視頻版》(資深)

  • 《Java[BAT]面試必備》(資深)

分別適用于初中級,中高級,資深級工程師的面試復(fù)習(xí)。

內(nèi)容包含java基礎(chǔ)、javaweb、mysql性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列,高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper、數(shù)據(jù)結(jié)構(gòu)、限流熔斷降級等等。

string類型有沒有長度限制(懵了面試官問我)(17)

看到這里,證明有所收獲

TAGS標(biāo)簽:  string  類型  有沒有  長度  限制  string類型有沒

歡迎分享轉(zhuǎn)載→http://www.avcorse.com/read-235720.html

Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖