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