java常量字符串過長報錯的解決辦法以及原因分析
1.發(fā)生問題的場景
我在用java獲取一個接口的大JSON字符串,并賦值給String常量時,遇到了java: 常量字符串過長這個報錯
2.解決問題
2.1 可以使用StringBuilder(線程不安全)或StringBuffer(線程安全,即append方法被synchronize修飾)的append方法來拼接一個String,最后再通過toString()方法轉(zhuǎn)為String即可
2.2 也可以使用 += 符號來拼接字符串,在javac中,String的 += 符號被重載為了StringBuilder的append方法,有興趣的可以去了解一下
3.問題的原因
那么為啥會報這個問題呢?翻閱jvm規(guī)范發(fā)現(xiàn):
在java中,常量String的結(jié)構(gòu)體如下,其中的string_index指針指向常量池的一個條目,這個條目的結(jié)構(gòu)體格式為CONSTANT_Utf8_info
我們來看這個CONSTANT_Utf8_info 結(jié)構(gòu)體,由下圖可知一個String類型的常量的最大長度為2^16-1,但事實真的如此嗎?
經(jīng)過測試,我發(fā)現(xiàn)實際最多存2^16-1-1個字符,這是為什么呢?我先去下載了javac的源碼(在lib/scr.zip中),我在\lib\src\jdk.compiler\com\sun\tools\javac\jvm|Gen.java中看到了:
而這個PoolWriter.MAX_STRING_LENGTH的值為:
所以可以得出,javac允許常量String保存的最大字節(jié)數(shù)為0xFFFF-1即2^16-2 ?。。?/p>
最后挖個坑,不知道為啥StringBuilder、StringBuffer、+=符號是如何讓String動態(tài)增長的?
4.參考
1.java String 到底有多長?String超出長度怎么解決?
2.字符串String的+和+=及循環(huán)操作String的原理
總結(jié)
到此這篇關(guān)于java常量字符串過長報錯解決的文章就介紹到這了,更多相關(guān)java常量字符串過長報錯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中List Set和Map之間的區(qū)別_動力節(jié)點Java學(xué)院整理
Java集合的主要分為三種類型set集,list列表,map映射,接下來通過本文給大家詳細介紹java中l(wèi)ist、Set和Map之間的區(qū)別,需要的的朋友參考下吧2017-05-05java中extends與implements的區(qū)別淺談
java中extends與implements的區(qū)別淺談,需要的朋友可以參考一下2013-03-03SpringBoot實現(xiàn)excel文件生成和下載
這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)excel文件生成和下載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-02-02SpringBoot實現(xiàn)自定義注解用于文件驗證的詳細過程(大小、擴展名、MIME類型)
SpringBoot,Spring Cloud中經(jīng)常需要處理文件上傳的功能,為了確保上傳的文件滿足特定的要求(如擴展名、MIME類型和文件大?。?我們可以創(chuàng)建一個自定義注解來簡化驗證過程,需要的朋友可以參考下2024-08-08使用JSCH框架通過跳轉(zhuǎn)機訪問其他節(jié)點的方法
下面小編就為大家分享一篇使用JSCH框架通過跳轉(zhuǎn)機訪問其他節(jié)點的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12Java請求流量合并和拆分提高系統(tǒng)的并發(fā)量示例
這篇文章主要為大家介紹了Java請求流量合并和拆分提高系統(tǒng)的并發(fā)量示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04