最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java常量字符串過(guò)長(zhǎng)報(bào)錯(cuò)的解決辦法以及原因分析

 更新時(shí)間:2023年01月30日 11:16:18   作者:gusangg  
在IDEA中字符串長(zhǎng)度超過(guò)65535,進(jìn)行打印,IDEA會(huì)提示java:常量字符串過(guò)長(zhǎng),這篇文章主要給大家介紹了關(guān)于java常量字符串過(guò)長(zhǎng)報(bào)錯(cuò)的解決辦法以及原因分析,需要的朋友可以參考下

1.發(fā)生問(wèn)題的場(chǎng)景

我在用java獲取一個(gè)接口的大JSON字符串,并賦值給String常量時(shí),遇到了java: 常量字符串過(guò)長(zhǎng)這個(gè)報(bào)錯(cuò)

2.解決問(wèn)題

2.1 可以使用StringBuilder(線程不安全)或StringBuffer(線程安全,即append方法被synchronize修飾)的append方法來(lái)拼接一個(gè)String,最后再通過(guò)toString()方法轉(zhuǎn)為String即可

2.2 也可以使用 += 符號(hào)來(lái)拼接字符串,在javac中,String的 += 符號(hào)被重載為了StringBuilder的append方法,有興趣的可以去了解一下

3.問(wèn)題的原因

那么為啥會(huì)報(bào)這個(gè)問(wèn)題呢?翻閱jvm規(guī)范發(fā)現(xiàn):

在java中,常量String的結(jié)構(gòu)體如下,其中的string_index指針指向常量池的一個(gè)條目,這個(gè)條目的結(jié)構(gòu)體格式為CONSTANT_Utf8_info

我們來(lái)看這個(gè)CONSTANT_Utf8_info 結(jié)構(gòu)體,由下圖可知一個(gè)String類型的常量的最大長(zhǎng)度為2^16-1,但事實(shí)真的如此嗎?

經(jīng)過(guò)測(cè)試,我發(fā)現(xiàn)實(shí)際最多存2^16-1-1個(gè)字符,這是為什么呢?我先去下載了javac的源碼(在lib/scr.zip中),我在\lib\src\jdk.compiler\com\sun\tools\javac\jvm|Gen.java中看到了:

而這個(gè)PoolWriter.MAX_STRING_LENGTH的值為:

所以可以得出,javac允許常量String保存的最大字節(jié)數(shù)為0xFFFF-1即2^16-2 !?。?/p>

最后挖個(gè)坑,不知道為啥StringBuilder、StringBuffer、+=符號(hào)是如何讓String動(dòng)態(tài)增長(zhǎng)的?

4.參考

1.java String 到底有多長(zhǎng)?String超出長(zhǎng)度怎么解決?

2.字符串String的+和+=及循環(huán)操作String的原理

總結(jié)

到此這篇關(guān)于java常量字符串過(guò)長(zhǎng)報(bào)錯(cuò)解決的文章就介紹到這了,更多相關(guān)java常量字符串過(guò)長(zhǎng)報(bào)錯(cuò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

龙门县| 新巴尔虎右旗| 元阳县| 佛坪县| 友谊县| 洛扎县| 满洲里市| 栾川县| 东阿县| 阳谷县| 双峰县| 唐河县| 乐东| 河东区| 阜平县| 新竹市| 广南县| 临湘市| 丰城市| 庄河市| 剑川县| 光山县| 芜湖县| 马尔康县| 紫金县| 宁晋县| 南华县| 会东县| 新巴尔虎右旗| 准格尔旗| 常山县| 基隆市| 铁岭市| 朔州市| 大关县| 安溪县| 逊克县| 宜川县| 巴楚县| 图们市| 平潭县|