字符串的长度怎么表示 字符串的长度怎么判断 编辑

今天口袋百科小编给大家带来字符串的长度怎么表示 字符串的长度怎么判断的相关知识点,希望对各位有所帮助,如果能碰巧解决你现在面临的问题,别忘了关注本站哦,现在开始吧!

字符串的长度怎么表示 字符串的长度怎么判断

字符串的长度怎么示 字符串的长度怎么判断?很多人不了解,今天口袋百科为大家带来相关内容,以下是小编为大家带来的介绍。

首先,要知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 小。当程序计数器在范围历史上的一个设计缺陷:如果 Java 虚拟机中的一个方法的 code 属性的长度刚好是 65535个字节,并且以一个 1 个字节长度的指令结束,那么这条指令将不能被异常处理器所处理。不过编译器可以通过限制任何方法、实例初始化方法或类初始化方法的code<>数组最大长度为 65534,这样可以间接弥补这个 bug

注意:这里对个人认为比较重要的点做了标记,首先第一个加粗说白了就是说数组有效范围就是【0-65565】但是第二个加粗的地方又解释了,因为虚拟机还需要1个字节的指令作为结束,所以其实真正的有效范围是【0-65564】,这里要注意这里的范围仅限编译时期,如果你是运行时拼接的字符串是可以超出这个范围的。

然后我们将字符复制后以定义字面量的形式值给字符串,可以看到我们选择这些字符右下角显示的确实是65534,于是乎运行了一波,果然成功了。

看到这里我们来总结一下:问:字符串有长度限制吗?是多少?

但是通过翻阅java虚拟机手册对class文件格式的定义以及常量池中对String类型的结构体定义我们可以知道对于索引定义了u2,就是无符号占2个字节,2个字节可以表示的最大范围是2^16 -1 = 65535。其实是65535,但是由于JVM需要1个字节表示结束指令,所以这个范围就为65534了。超出这个范围在编译时期是会报错的,但是运行时拼接或赋值的话范围是在整形的最大范围。

解析到这里就告一段落了,如果觉得在下讲得对你有帮助的可以点一波关注,下方的小拇指点一波支持,如果发现有讲的不好的或者有什么遗漏的,欢迎评论区留言相互学习,进步,后期会不定期更新更多的技术编程相关的文章

好了,今天关于字符串的长度怎么表示 字符串的长度怎么判断的知识点,就分享到这里,如果能给大家带来些许帮助,小编也是蛮兴的噢...