java?String到底有多長?String超出長度該如何解決
Java String 可以有多長?
1. 字符串有多長是指字符數(shù)還是字節(jié)數(shù)?
2.字符串有幾種存在形式?
3.字符串存在的形式有那些限制?
由一個問題,我們可以延伸出這么多問題?
2種存在形式
樣板代碼:
// 棧 String longStr = "aaaaa.....aaaaa";
這種樣板代碼的形式是存在棧中。
從文件中讀取字符串:
// 堆
byte[] strByte = loadFromFile(new File("String.txt"));
String longStr = new String(strByte);這種通過從文件中讀取字符串的形式是存在堆中。
棧中的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é)長度為65535,由此得出棧中String的最大長度可以裝65535個字節(jié)?
當我們寫65535個a的時候運行它居然報錯:error: constant string too long
不思其解???
我們找到javac編譯源碼: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個拉丁字符。
引發(fā)思考既然能裝65534個拉丁字符,那能裝多少個中文字符呢?
有人這時馬上就說能裝 65534/3個,結果出乎意料中文能裝65535/3個。
我們再一起探索中文字符,我們再次翻出javac源碼進行探索
路徑:/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java
writePool 方法

可以看到這里寫的是 bs.length > Pool.MAX_STRING_LENGTH 就會拋出異常,那么證明中文字符是可以裝65535/3個。
由此我們得出結論:在棧中的字符串可以裝拉丁字節(jié)65534個,非拉丁字節(jié)可以裝65535個,可以裝中文字符65535/3個。
堆中的String
// 堆
byte[] strByte = loadFromFile(new File("String.txt"));
String longStr = new String(strByte);String內(nèi)部是以char數(shù)組的形式存儲,數(shù)組的長度是int類型,那么String允許的最大長度就是Integer.MAX_VALUE,不過也受實際的內(nèi)存影響。
String超出長度怎么解決?
由此得出如果我們的字符長過長,我們可以通過寫文件 讀文件的方式去解決。
javac編譯源碼github參考地址:https://github.com/infobip/infobip-open-jdk-8
補充:Java string 長度不足補0的方法
方法如下:
String s=String.format("%02d", 1)
//1為int類型,0代表前面要補的字符 2代表字符串長度,d表示參數(shù)為整數(shù)類型總結
到此這篇關于java String到底有多長?String超出長度該如何解決的文章就介紹到這了,更多相關java String有多長內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot如何優(yōu)雅的處理校驗參數(shù)的方法
這篇文章主要介紹了SpringBoot如何優(yōu)雅的處理校驗參數(shù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12
劍指Offer之Java算法習題精講字符串操作與數(shù)組及二叉搜索樹
跟著思路走,之后從簡單題入手,反復去看,做過之后可能會忘記,之后再做一次,記不住就反復做,反復尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化2022-03-03
Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式總結
使用Mybatis-plus可以很方便的實現(xiàn)批量新增和批量修改,不僅比自己寫foreach遍歷方便很多,而且性能也更加優(yōu)秀,下面這篇文章主要給大家介紹了關于Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式,需要的朋友可以參考下2023-05-05
如何獲取springboot打成jar后的classpath
這篇文章主要介紹了如何獲取springboot打成jar后的classpath問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

