字符串的长度怎么表示 字符串的长度怎么判断?很多人不了解,今天趣百科为大家带来相关内容,以下是小编为大家带来的介绍。
首先,要知道String的长度限制,我们需要知道String是如何存储字符串的。String实际上使用一个char数组来存储字符串中的字符。
那么,既然String是数组存储,那么数组会有长度限制吗?是的,有限制,但是是在先提的情况下。我们来看看String中返回长度的方法。
由此可见,返回值类型是int类型,Java中定义的数组长度是可以指定的。当然,如果没有指定,默认情况下会根据数组元素来指定:
整数范围的整数
以文字形式定义字符串
其实这里涉及到JVM编译规范的限制。事实上,在JVM编译时,如果我们将一个字符串定义为文字形式,JVM会在编译时将其存储在一个常量池中。此时,JVM对这个常量池中字符串类型的存储做了限制。接下来,我们来看看手册是怎么说的。
在常量池中,每个cp_info项必须具有相同的格式,它们都以一个表示cp_info类型的单字节“tag”项开始。以下信息项的内容由标签的类型决定。
我们可以看到字符串类型的表示是CONSTANT_String。我们来看看CONSTANT_String是怎么定义的。
在类文件中,u2表示无符号数占用2个字节单元。我们知道1个字节占用8位,2个字节是16位,所以2个字节能代表的范围是2 ^ 16-1=65535。标准类文件格式中u1和u2的定义解释总结如下:
1.类文件中文件内容类型的解释
表1显示了1、2和4字节的无符号数。
根据be的说法
构造成 2 个、4 个和 8 个 8 字节单位来表示。2、程序异常处理的有效范围解释start_pc 和 end_pc 两项的值表明了异常处理器在 code<>数组中的有效范围。start_pc 必须是对当前 code<>数组中某一指令的操作码的有效索引,end_pc 要么是对当前 code<>数组中某一指令的操作码的有效索引,要么等于 code_length的值,即当前 code<>数组的长度。start_pc 的值必须比 end_pc 小。当程序计数器在范围
注意:这里对个人认为比较重要的点做了标记,首先第一个加粗说白了就是说数组有效范围就是【0-65565】但是第二个加粗的地方又解释了,因为虚拟机还需要1个字节的指令作为结束,所以其实真正的有效范围是【0-65564】,这里要注意这里的范围仅限编译时期,如果你是运行时拼接的字符串是可以超出这个范围的。
然后我们将字符复制后以定义字面量的形式赋值给字符串,可以看到我们选择这些字符右下角显示的确实是65534,于是乎运行了一波,果然成功了。
看到这里我们来总结一下:问:字符串有长度限制吗?是多少?
但是通过翻阅java虚拟机手册对class文件格式的定义以及常量池中对String类型的结构体定义我们可以知道对于索引定义了u2,就是无符号占2个字节,2个字节可以表示的最大范围是2^16 -1 = 65535。其实是65535,但是由于JVM需要1个字节表示结束指令,所以这个范围就为65534了。超出这个范围在编译时期是会报错的,但是运行时拼接或者赋值的话范围是在整形的最大范围。
解析到这里就告一段落了,如果觉得在下讲得对你有帮助的可以点一波关注,下方的小拇指点一波支持,如果发现有讲的不好的或者有什么遗漏的,欢迎评论区留言相互学习,进步,后期会不定期更新更多的技术编程相关的文章。