java?String到底有多長(zhǎng)?String超出長(zhǎng)度該如何解決
Java String 可以有多長(zhǎng)?
1. 字符串有多長(zhǎng)是指字符數(shù)還是字節(jié)數(shù)?
2.字符串有幾種存在形式?
3.字符串存在的形式有那些限制?
由一個(gè)問題,我們可以延伸出這么多問題?
2種存在形式
樣板代碼:
// 棧 String longStr = "aaaaa.....aaaaa";
這種樣板代碼的形式是存在棧中。
從文件中讀取字符串:
// 堆
byte[] strByte = loadFromFile(new File("String.txt"));
String longStr = new String(strByte);這種通過(guò)從文件中讀取字符串的形式是存在堆中。
棧中的String
// 棧 String longStr = "aaaaa.....aaaaa";
CONSTANT_Utf8_info{
u1 tag;
u2 length; // 16位證書 2^16-1 = 65535 0~65535
u1 bytes[length]; // 65535
}Java String 的字節(jié)長(zhǎng)度為65535,由此得出棧中String的最大長(zhǎng)度可以裝65535個(gè)字節(jié)?
當(dāng)我們寫65535個(gè)a的時(shí)候運(yùn)行它居然報(bào)錯(cuò):error: constant string too long
不思其解???
我們找到j(luò)avac編譯源碼:view src/share/classes/com/sun/tools/javac/jvm/Gen.java
找到方法:checkStringConstant()

我們看下Pool.MAX_STRING_LENGTH 是多少
路徑:/langtools/src/share/classes/com/sun/tools/javac/jvm/Pool.java

由此得出必須得小于65535,所以String 能裝65534個(gè)拉丁字符。
引發(fā)思考既然能裝65534個(gè)拉丁字符,那能裝多少個(gè)中文字符呢?
有人這時(shí)馬上就說(shuō)能裝 65534/3個(gè),結(jié)果出乎意料中文能裝65535/3個(gè)。
我們?cè)僖黄鹛剿髦形淖址覀冊(cè)俅畏鰆avac源碼進(jìn)行探索
路徑:/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java
writePool 方法

可以看到這里寫的是 bs.length > Pool.MAX_STRING_LENGTH 就會(huì)拋出異常,那么證明中文字符是可以裝65535/3個(gè)。
由此我們得出結(jié)論:在棧中的字符串可以裝拉丁字節(jié)65534個(gè),非拉丁字節(jié)可以裝65535個(gè),可以裝中文字符65535/3個(gè)。
堆中的String
// 堆
byte[] strByte = loadFromFile(new File("String.txt"));
String longStr = new String(strByte);String內(nèi)部是以char數(shù)組的形式存儲(chǔ),數(shù)組的長(zhǎng)度是int類型,那么String允許的最大長(zhǎng)度就是Integer.MAX_VALUE,不過(guò)也受實(shí)際的內(nèi)存影響。
String超出長(zhǎng)度怎么解決?
由此得出如果我們的字符長(zhǎng)過(guò)長(zhǎng),我們可以通過(guò)寫文件 讀文件的方式去解決。
javac編譯源碼github參考地址:https://github.com/infobip/infobip-open-jdk-8
補(bǔ)充:Java string 長(zhǎng)度不足補(bǔ)0的方法
方法如下:
String s=String.format("%02d", 1)
//1為int類型,0代表前面要補(bǔ)的字符 2代表字符串長(zhǎng)度,d表示參數(shù)為整數(shù)類型總結(jié)
到此這篇關(guān)于java String到底有多長(zhǎng)?String超出長(zhǎng)度該如何解決的文章就介紹到這了,更多相關(guān)java String有多長(zhǎng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合Mybatis-Plus分頁(yè)失效的解決
本文主要介紹了SpringBoot整合Mybatis-Plus分頁(yè)失效的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
?Java圖形化界面編程實(shí)現(xiàn)簡(jiǎn)單計(jì)算器
這篇文章主要介紹了Java圖形化界面編程實(shí)現(xiàn)簡(jiǎn)單計(jì)算器,下面文章圍繞Java圖形化界面編程實(shí)現(xiàn)簡(jiǎn)單計(jì)算器的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-01-01
java編寫簡(jiǎn)單的E-mail發(fā)送端程序
這篇文章主要介紹了使用java語(yǔ)言編寫一個(gè)簡(jiǎn)單的E-mail發(fā)送端程序,感興趣的小伙伴們可以參考一下2016-02-02
java代碼規(guī)范之不合理命名與重復(fù)代碼示例詳解
這篇文章主要為大家介紹了java代碼規(guī)范之不合理命名與重復(fù)代碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Java如何實(shí)現(xiàn)圖片裁剪預(yù)覽功能
通常注冊(cè)賬戶上傳用戶圖像時(shí)需要進(jìn)行預(yù)覽,這篇文章就是教我們?nèi)绾斡?Java 實(shí)現(xiàn)圖片裁剪預(yù)覽功能,需要的朋友可以參考下2015-07-07
SpringBoot全局配置long轉(zhuǎn)String丟失精度的問題解決
web項(xiàng)目中,Java后端傳過(guò)來(lái)的Long/long類型,前端JS接收會(huì)丟失精度。那么應(yīng)該如何解決,本文就來(lái)介紹一下幾種方法,感興趣的可以了解一下2021-08-08

