Java中String能存儲多少個字符
首先String的length方法返回是int。所以理論上長度一定不會超過int的最大值。
編譯器源碼如下,限制了字符串長度大于等于65535就會編譯不通過
private void checkStringConstant(DiagnosticPosition var1, Object var2) {
if (this.nerrs == 0 && var2 != null && var2 instanceof String && ((String)var2).length() >= 65535) {
this.log.error(var1, "limit.string", new Object[0]);
++this.nerrs;
}
}
Java中的字符常量都是使用UTF8編碼的,UTF8編碼使用1~4個字節(jié)來表示具體的Unicode字符。所以有的字符占用一個字節(jié),而我們平時所用的大部分中文都需要3個字節(jié)來存儲。
//65534個字母,編譯通過 String s1 = "dd..d"; //21845個中文”自“,編譯通過 String s2 = "自自...自"; //一個英文字母d加上21845個中文”自“,編譯失敗 String s3 = "d自自...自";
對于s1,一個字母d的UTF8編碼占用一個字節(jié),65534字母占用65534個字節(jié),長度是65534,長度和存儲都沒超過限制,所以可以編譯通過。
對于s2,一個中文占用3個字節(jié),21845個正好占用65535個字節(jié),而且字符串長度是21845,長度和存儲也都沒超過限制,所以可以編譯通過。
對于s3,一個英文字母d加上21845個中文”自“占用65536個字節(jié),超過了存儲最大限制,編譯失敗。
JVM規(guī)范對常量池有所限制。量池中的每一種數(shù)據(jù)項都有自己的類型。Java中的UTF-8編碼的Unicode字符串在常量池中以CONSTANTUtf8類型表示。CONSTANTUtf8的數(shù)據(jù)結(jié)構(gòu)如下:
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
我們重點關(guān)注下長度為 length 的那個bytes數(shù)組,這個數(shù)組就是真正存儲常量數(shù)據(jù)的地方,而 length 就是數(shù)組可以存儲的最大字節(jié)數(shù)。length 的類型是u2,u2是無符號的16位整數(shù),因此理論上允許的的最大長度是2^16-1=65535。所以上面byte數(shù)組的最大長度可以是65535
運行時限制
String 運行時的限制主要體現(xiàn)在 String 的構(gòu)造函數(shù)上。下面是 String 的一個構(gòu)造函數(shù):
public String(char value[], int offset, int count) {
...
}
上面的count值就是字符串的最大長度。在Java中,int的最大長度是2^31-1。所以在運行時,String 的最大長度是2^31-1。
但是這個也是理論上的長度,實際的長度還要看你JVM的內(nèi)存。我們來看下,最大的字符串會占用多大的內(nèi)存。
(2^31-1)*16/8/1024/1024/1024 = 2GB
所以在最壞的情況下,一個最大的字符串要占用 2GB的內(nèi)存。如果你的虛擬機不能分配這么多內(nèi)存的話,會直接報錯的。
補充 JDK9以后對String的存儲進行了優(yōu)化。底層不再使用char數(shù)組存儲字符串,而是使用byte數(shù)組。對于LATIN1字符的字符串可以節(jié)省一倍的內(nèi)存空間。
到此這篇關(guān)于Java中String能存儲多少個字符的文章就介紹到這了,更多相關(guān)Java String 存儲字符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot集成Apache Kafka的實戰(zhàn)指南
Apache Kafka 是一個分布式流處理平臺,廣泛用于構(gòu)建實時數(shù)據(jù)管道、日志聚合系統(tǒng)和事件溯源架構(gòu),下面我們來看看如何在 Spring Boot 項目中集成 Kafka吧2025-06-06
mybatis-plus通用枚舉@JsonValue接收參數(shù)報錯No enum constant
最近在使用mybatis-plus時用到了通用枚舉,遇到了問題,本文主要介紹了mybatis-plus通用枚舉@JsonValue接收參數(shù)報錯No enum constant,具有一定的參考價值,感興趣的可以了解一下2023-09-09
SpringBoot中MyBatis-Flex的集成和使用實現(xiàn)
MyBatis-Flex是一個基于MyBatis的數(shù)據(jù)訪問框架,MyBatis-Flex能夠極大地提高我們的開發(fā)效率和開發(fā)體驗,本文主要介紹了SpringBoot中MyBatis-Flex的集成和使用實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-12-12
SpringBoot實現(xiàn)熱部署的方式總結(jié)
所謂熱部署,就是在應(yīng)用正在運行的時候升級軟件,卻不需要重新啟動應(yīng)用,對于Java來說,熱部署就是在運行時更新Java類文件,本文將深入探討SpringBoot有哪些方式可以實現(xiàn)熱部署,感興趣的朋友可以小編一探討學習2023-06-06
SpringBoot基于Java Agent實現(xiàn)項目監(jiān)控
在生產(chǎn)環(huán)境中,監(jiān)控對于項目問題的分析排查變得尤為重要,本文將介紹如何利用Java Agent技術(shù)實現(xiàn)對SpringBoot應(yīng)用的無侵入式監(jiān)控,有需要的小伙伴可以了解下2025-07-07

