色欲av一区久久精品_久久综合色综合色88_无码在线观看不卡_色黄视频网站_亚洲国产精品久久久久秋霞66

Java 中的 String 有沒有長度限制?

時間:2023-05-17

String是Java中很重要的一個數(shù)據(jù)類型,除了基本數(shù)據(jù)類型以外,String是被運用的最廣泛的了,可是,關于String,其實仍是有很多東西容易被疏忽的。
就如本文咱們要評論的問題:Java中的String有沒有長度約束?
這個問題要分兩個階段看,分別是編譯期和運行期。不同的時期約束不一樣。
01編譯期
首要,咱們先來合理的揣度一下,當咱們在代碼中運用Strings=””;的方法來界說String對象的時候,””中字符的個數(shù)有沒有約束呢?
既然是合理的揣度,那就要要足夠的依據(jù),所以咱們能夠從String的源碼入手,依據(jù)publicString(charvalue[],intoffset,intcount)的界說,count是int類型的,所以,charvalue[]中最多能夠保存Integer.MAX_VALUE個,即2147483647字符。(jdk1.8.0_73)Java
可是,實驗證明,Strings=””;中,最多能夠有65534個字符。假如超越這個個數(shù)。就會在編譯期報錯。
publicstaticvoidmain(String[]args){
Strings=”a…a”;
System.out.println(s.length());
Strings1=”a…a”;
System.out.println(s1.length());
}
以上代碼,會在Strings1=”a…a”;//共65535個a處編譯失利:
?javacStringLenghDemo.javaStringLenghDemo.java:11:錯誤:常量字符串過長
明明說好的長度約束是2147483647,為什么65535個字符就無法編譯了呢?
當咱們運用字符串字面量直接界說String的時候,是會把字符串在常量池中存儲一份的。那么上面說到的65534其實是常量池的約束。
常量池中的每一種數(shù)據(jù)項也有自己的類型。Java中的UTF-8編碼的Unicode字符串在常量池中以CONSTANT_Utf8類型表示。
CONSTANTUtf8info是一個CONSTANTUtf8類型的常量池數(shù)據(jù)項,它存儲的是一個常量字符串。常量池中的一切字面量簡直都是經(jīng)過CONSTANTUtf8info描繪的。CONSTANTUtf8_info的界說如下:
CONSTANT_Utf8_info{u1tag;u2length;u1bytes[length];
}
由于本文的要點并不是CONSTANTUtf8info的介紹,這兒就不具體展開了,咱們只需要咱們運用字面量界說的字符串在class文件中,是運用CONSTANTUtf8info存儲的,而CONSTANTUtf8info中有u2length;表明了該類型存儲數(shù)據(jù)的長度。
u2是無符號的16位整數(shù),因而理論上允許的的最大長度是2^16=65536。而javaclass文件是運用一種變體UTF-8格局來寄存字符的,null值運用兩個字節(jié)來表示,因而只剩下65536-2=65534個字節(jié)。
關于這一點,在theclassfileformatspec中也有清晰說明:
Thelengthoffieldandmethodnames,fieldandmethoddescriptors,andotherconstantstringvaluesislimitedto65535charactersbythe16-bitunsignedlengthitemoftheCONSTANTUtf8infostructure(§4.4.7).Notethatthelimitisonthenumberofbytesintheencodingandnotonthenumberofencodedcharacters.UTF-8encodessomecharactersusingtwoorthreebytes.Thus,stringsincorporatingmultibytecharactersarefurtherconstrained.
也便是說,在Java中,一切需要保存在常量池中的數(shù)據(jù),長度最大不能超越65535,這當然也包含字符串的界說咯。
02運行期
上面說到的這種String長度的約束是編譯期的約束,也便是運用Strings=””;這種字面值方法界說的時候才會有的約束。
那么。String在運行期有沒有約束呢,答案是有的,便是咱們前文說到的那個Integer.MAX_VALUE,這個值約等于4G,在運行期,假如String的長度超越這個規(guī)模,就可能會拋出異常。(在jdk1.9之前)
int是一個32位變量類型,取正數(shù)部分來算的話,他們最長能夠有
2^31-1=2147483647個16-bitUnicodecharacter2147483647*16=34359738352位34359738352/8=4294967294(Byte)4294967294/1024=4194303.998046875(KB)4194303.998046875/1024=4095.9999980926513671875(MB)4095.9999980926513671875/1024=3.99999999813735485076904296875(GB)
覺得不錯的話就點個美觀再走唄~

文章標簽:

Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權利。 粵ICP備09033321號

與項目經(jīng)理交流
掃描二維碼
與項目經(jīng)理交流
掃描二維碼
與項目經(jīng)理交流
ciya68