
字符串的長(zhǎng)度怎么表示 字符串的長(zhǎng)度怎么判斷?很多人不了解,今天各百科為大家?guī)?lái)相關(guān)內(nèi)容,以下是小編為大家?guī)?lái)的介紹。
首先,要知道String的長(zhǎng)度限制,我們需要知道String是如何存儲(chǔ)字符串的。String實(shí)際上使用一個(gè)char數(shù)組來(lái)存儲(chǔ)字符串中的字符。
那么,既然String是數(shù)組存儲(chǔ),那么數(shù)組會(huì)有長(zhǎng)度限制嗎?是的,有限制,但是是在先提的情況下。我們來(lái)看看String中返回長(zhǎng)度的方法。
由此可見,返回值類型是int類型,Java中定義的數(shù)組長(zhǎng)度是可以指定的。當(dāng)然,如果沒(méi)有指定,默認(rèn)情況下會(huì)根據(jù)數(shù)組元素來(lái)指定:
整數(shù)范圍的整數(shù)
以文字形式定義字符串
其實(shí)這里涉及到JVM編譯規(guī)范的限制。事實(shí)上,在JVM編譯時(shí),如果我們將一個(gè)字符串定義為文字形式,JVM會(huì)在編譯時(shí)將其存儲(chǔ)在一個(gè)常量池中。此時(shí),JVM對(duì)這個(gè)常量池中字符串類型的存儲(chǔ)做了限制。接下來(lái),我們來(lái)看看手冊(cè)是怎么說(shuō)的。
在常量池中,每個(gè)cp_info項(xiàng)必須具有相同的格式,它們都以一個(gè)表示cp_info類型的單字節(jié)“tag”項(xiàng)開始。以下信息項(xiàng)的內(nèi)容由標(biāo)簽的類型決定。
我們可以看到字符串類型的表示是CONSTANT_String。我們來(lái)看看CONSTANT_String是怎么定義的。
在類文件中,u2表示無(wú)符號(hào)數(shù)占用2個(gè)字節(jié)單元。我們知道1個(gè)字節(jié)占用8位,2個(gè)字節(jié)是16位,所以2個(gè)字節(jié)能代表的范圍是2 ^ 16-1=65535。標(biāo)準(zhǔn)類文件格式中u1和u2的定義解釋總結(jié)如下:
1.類文件中文件內(nèi)容類型的解釋
表1顯示了1、2和4字節(jié)的無(wú)符號(hào)數(shù)。
根據(jù)be的說(shuō)法
構(gòu)造成 2 個(gè)、4 個(gè)和 8 個(gè) 8 字節(jié)單位來(lái)表示。2、程序異常處理的有效范圍解釋start_pc 和 end_pc 兩項(xiàng)的值表明了異常處理器在 code<>數(shù)組中的有效范圍。start_pc 必須是對(duì)當(dāng)前 code<>數(shù)組中某一指令的操作碼的有效索引,end_pc 要么是對(duì)當(dāng)前 code<>數(shù)組中某一指令的操作碼的有效索引,要么等于 code_length的值,即當(dāng)前 code<>數(shù)組的長(zhǎng)度。start_pc 的值必須比 end_pc 小。當(dāng)程序計(jì)數(shù)器在范圍
注意:這里對(duì)個(gè)人認(rèn)為比較重要的點(diǎn)做了標(biāo)記,首先第一個(gè)加粗說(shuō)白了就是說(shuō)數(shù)組有效范圍就是【0-65565】但是第二個(gè)加粗的地方又解釋了,因?yàn)樘摂M機(jī)還需要1個(gè)字節(jié)的指令作為結(jié)束,所以其實(shí)真正的有效范圍是【0-65564】,這里要注意這里的范圍僅限編譯時(shí)期,如果你是運(yùn)行時(shí)拼接的字符串是可以超出這個(gè)范圍的。
然后我們將字符復(fù)制后以定義字面量的形式賦值給字符串,可以看到我們選擇這些字符右下角顯示的確實(shí)是65534,于是乎運(yùn)行了一波,果然成功了。
看到這里我們來(lái)總結(jié)一下:?jiǎn)枺鹤址虚L(zhǎng)度限制嗎?是多少?
但是通過(guò)翻閱java虛擬機(jī)手冊(cè)對(duì)class文件格式的定義以及常量池中對(duì)String類型的結(jié)構(gòu)體定義我們可以知道對(duì)于索引定義了u2,就是無(wú)符號(hào)占2個(gè)字節(jié),2個(gè)字節(jié)可以表示的最大范圍是2^16 -1 = 65535。其實(shí)是65535,但是由于JVM需要1個(gè)字節(jié)表示結(jié)束指令,所以這個(gè)范圍就為65534了。超出這個(gè)范圍在編譯時(shí)期是會(huì)報(bào)錯(cuò)的,但是運(yùn)行時(shí)拼接或者賦值的話范圍是在整形的最大范圍。
解析到這里就告一段落了,如果覺得在下講得對(duì)你有幫助的可以點(diǎn)一波關(guān)注,下方的小拇指點(diǎn)一波支持,如果發(fā)現(xiàn)有講的不好的或者有什么遺漏的,歡迎評(píng)論區(qū)留言相互學(xué)習(xí),進(jìn)步,后期會(huì)不定期更新更多的技術(shù)編程相關(guān)的文章。














