的前言说Java中的String是有长度限制的。很多人听了不禁要问,String有长度限制吗?是的,而且JVM编译里面有规范,我家的一些人在面试的时候也遇到过。面试的时候遇到过这个问题,在之前的开发中其实也遇到过这种String长度限制的场景(将一个固定的文件转码成Base64的形式存储成字符串,运行时需要的时候再转回来,而当时文件比较大),那么规格限制是多少,先不说了。String首先我们要知道String的长度限制。我们需要知道String是如何存储字符串的。String其实就是用一个char类型的数组来存储字符串中的字符。存放String的容器本来就是它。既然String是存储在数组中,那么数组的长度会不会有限制呢?是的,有一个限制,但这是前提条件。我们看一下String中返回length的方法。String类中的length方法表明返回值类型是int类型。Java中定义的数组可以指定数组的长度。当然,如果不指定,默认按照数组元素指定:int[]arr1=newint[10];//定义一个长度为10的数组int[]arr2={1,2,3,4,5};//那么数组的长度就是5。java中整数是有限制的,我们通过查看源码再看int类型对应的包装类Integer,可以看到它的最大长度限制为2^31-1,也就是说数组的长度是0~2^31-1,那么计算就是(2^31-1=2147483647=4GB)Integer的取值范围看到这里,我们尝试验证一下以上观点通过编码。定义字面量形式的字符串上面是我通过定义字面量形式构造的100000个字符的字符串。编译之后虚拟机提示错误,说我们的字符串长度过长。有可能节省21亿吗?一?为什么只有100,000时会出现错误?其实这就涉及到JVM编译规范的限制。其实在JVM编译的时候,如果我们把字符串定义成字面量形式,JVM就会编译。它存储在常量池中。这时JVM已经限制了String类型在这个常量池中的存储。接下来我们看看说明书是怎么说的。在java虚拟机规范截图常量池中,每一个cp_info项的格式必须是一样的,都是以一个代表cp_info类型的单字节“tag”项开头。下面的info[]项的内容由标签的类型决定。在Java虚拟机规范手册的常量类型表中,我们可以看到String类型的表示是CONSTANT_String。让我们看看CONSTANT_String是如何定义的。这里定义的u2string_index表示常量池的有效索引,其类型由CONSTANT_Utf8_info结构体表示。这里需要注意其中定义的长度。让我们看看下面的图片。在class文件中,u2代表一个无符号数,占用2个字节单元。我们知道1字节占8位,2字节占16位。那么2个字节可以表示的范围就是2^16-1=65535。泛中的class文件格式对u1和u2的定义做了简单总结:这里是java虚拟机规范part1的总结,解释class文件中的文件内容类型定义了一组私有数据类型来表示Class文件的内容,它们包括u1、u2和u4分别表示1、2和4字节的无符号数。每个Class文件都是由以8字节为单位的字节流组成,所有16位、32位、64位长度的数据都会构造成2个、4个、8个8字节单位来表示。2、程序异常处理有效范围的说明start_pc和end_pc的值表示code[]数组中异常处理程序的有效范围。start_pc必须是当前code[]数组中指令操作码的有效索引,end_pc是当前code[]数组中指令操作码的有效索引,或者等于code_length的值,它是当前code[]]数组的长度。start_pc的值必须小于end_pc。当程序计数器在[start_pc,end_pc)范围内时,异常处理程序才会生效。即令x为异常句柄有效范围内的值,且x满足:start_pc≤x
