志在指尖
用双手敲打未来

Java 中的 String 有没有长度限制?

String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被运用的最广泛的了,可是,关于String,其实仍是有很多东西容易被疏忽的。
就如本文咱们要评论的问题:Java中的String有没有长度约束?
这个问题要分两个阶段看,分别是编译期和运行期。不同的时期约束不一样。
01编译期
首要,咱们先来合理的揣度一下,当咱们在代码中运用Strings=””;的方法来界说String对象的时候,””中字符的个数有没有约束呢?
既然是合理的揣度,那就要要足够的依据,所以咱们能够从String的源码入手,依据publicString(charvalue[],intoffset,intcount)的界说,count是int类型的,所以,charvalue[]中最多能够保存Integer.MAX_VALUE个,即2147483647字符。(jdk1.8.0_73)Java
可是,实验证明,Strings=””;中,最多能够有65534个字符。假如超越这个个数。就会在编译期报错。
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其实是常量池的约束。
常量池中的每一种数据项也有自己的类型。Java中的UTF-8编码的Unicode字符串在常量池中以CONSTANT_Utf8类型表示。
CONSTANTUtf8info是一个CONSTANTUtf8类型的常量池数据项,它存储的是一个常量字符串。常量池中的一切字面量简直都是经过CONSTANTUtf8info描绘的。CONSTANTUtf8_info的界说如下:
CONSTANT_Utf8_info{u1tag;u2length;u1bytes[length];
}
由于本文的要点并不是CONSTANTUtf8info的介绍,这儿就不具体展开了,咱们只需要咱们运用字面量界说的字符串在class文件中,是运用CONSTANTUtf8info存储的,而CONSTANTUtf8info中有u2length;表明了该类型存储数据的长度。
u2是无符号的16位整数,因而理论上允许的的最大长度是2^16=65536。而javaclass文件是运用一种变体UTF-8格局来寄存字符的,null值运用两个字节来表示,因而只剩下65536-2=65534个字节。
关于这一点,在theclassfileformatspec中也有清晰说明:
Thelengthoffieldandmethodnames,fieldandmethoddescriptors,andotherconstantstringvaluesislimitedto65535charactersbythe16-bitunsignedlengthitemoftheCONSTANTUtf8infostructure(§4.4.7).Notethatthelimitisonthenumberofbytesintheencodingandnotonthenumberofencodedcharacters.UTF-8encodessomecharactersusingtwoorthreebytes.Thus,stringsincorporatingmultibytecharactersarefurtherconstrained.
也便是说,在Java中,一切需要保存在常量池中的数据,长度最大不能超越65535,这当然也包含字符串的界说咯。
02运行期
上面说到的这种String长度的约束是编译期的约束,也便是运用Strings=””;这种字面值方法界说的时候才会有的约束。
那么。String在运行期有没有约束呢,答案是有的,便是咱们前文说到的那个Integer.MAX_VALUE,这个值约等于4G,在运行期,假如String的长度超越这个规模,就可能会抛出异常。(在jdk1.9之前)
int是一个32位变量类型,取正数部分来算的话,他们最长能够有
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)
觉得不错的话就点个美观再走呗~

未经允许不得转载:IT技术网站 » Java 中的 String 有没有长度限制?
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载