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)文章
使用Springboot+poi上傳并處理百萬級數(shù)據(jù)EXCEL
這篇文章主要介紹了使用Springboot+poi上傳并處理百萬級數(shù)據(jù)EXCEL,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
關(guān)于SpringBoot+Mybatis報MapperScan.factoryBean()問題
解決SpringBoot+Mybatis中的MapperScan.factoryBean()問題,讓你的項目運行更順暢!本指南將帶你一步步解決這個問題,讓你的開發(fā)過程更加高效,不要錯過這個實用指南,快來一探究竟吧!2024-02-02
springboot + mybatis配置多數(shù)據(jù)源示例
本篇文章主要介紹了springboot + mybatis配置多數(shù)據(jù)源示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
Josephus環(huán)的四種解法(約瑟夫環(huán))基于java詳解
這篇文章主要介紹了Josephus環(huán)的四種解法(約瑟夫環(huán))基于java詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09

