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

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

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

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

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

2.解決問題

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

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

3.問題的原因

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

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

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

經(jīng)過測(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 ?。?!

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

相關(guān)文章

最新評(píng)論

白城市| 西畴县| 宁陵县| 邛崃市| 金秀| 宁都县| 博野县| 禹城市| 天气| 江川县| 沁阳市| 灵宝市| 兰溪市| 阳西县| 霍林郭勒市| 阳朔县| 肥东县| 杭锦后旗| 乐亭县| 林甸县| 太和县| 通道| 临猗县| 勃利县| 罗田县| 永川市| 剑川县| 东光县| 雅江县| 三台县| 榆林市| 黄龙县| 梅河口市| 尼勒克县| 通河县| 开平市| 隆安县| 镇巴县| 远安县| 时尚| 徐汇区|