当前位置: 首页 > 科技观察

Java中一个String字符串可以有多长?65535?

时间:2023-03-17 22:43:19 科技观察

毫无疑问,String是一个Java开发工程师每天都需要打交道的类,那么如果问你String字符串的最大长度是多少,你知道吗?有的朋友可能想都没想,直接回答65535,那么问题来了,是真的吗?今天阿粉就带大家去研究一下。首先,对于String我们可以有如下用法:定义一个String类型的变量:privatestaticfinalStringSTRING_TEST="xxxxxxxxxxxx";或字符串newString="newString";通过在方法中定义一个String类型的变量,通过字节流创建一个字符串:byte[]bytes=newbyte[length];Strings=newString(bytes);;可能有朋友会说,这两个不是都定义了一个字符串变量,有什么区别呢?表面上看起来没有区别,但实际上区别还是挺大的。首先,第一种方式是定义一个静态类变量,或者普通的字符串变量。这种形式的字符串存储在堆栈中;第二种方法是将字符串存储在堆上。这时候有朋友又要问了,不同的地方有什么关系呢?首先,它有很大的关系!当字符串入栈时,根据class文件的result规范,我们可以看到所有使用的存储格式是这样的:CONSTANT_Utf8_info{u1tag;u2length;u1bytes[length];}其中u2是一种类似的数据类型Java中的int,但是它代表了一个2字节的数据类型,只是int是4个字节,也就是说允许的最大长度是65535个字符。这样我们就可以得到一个结果,当字符串存入栈内存时,字符串的长度可以达到65535。看到这里,小伙伴又不耐烦了,说:你看,我就说是65535,可我还是不相信。别着急,我们只讲了一半,接下来我们会看看第二种方式。很明显,第二种方法无论是通过字节流还是new一个对象,其存储位置都是在Java的堆内存中,而通过String的源码可以看出,底层是通过一个char[]数组来店铺。私有最终字符值[];那么我们就知道字符传输的大小和数组的长度是直接相关的。另外,在定义数组长度的时候,我们最多只能定义int类型的最大值,即Integer.MAX_VALUE=0x7fffffff;而String类的length()方法的返回值也可以看出,返回类型是int,最大值也是Integer.MAX_VALUE=0x7fffffff;/***Returnsthelengthofthisstring.*ThelengththisequaltothenumberofUnicode*codeunitsinthestring.**@returnthelengthofthesequenceofcharactersrepresentedbythis*object.*/publicintlength(){returnvalue.length;}所以看到这里,又得到了一个结果,**当字符串存储在堆内存时,最大长度为Integer.MAX_VALUE=0x7fffffff;**。不过需要注意的是,这个值是理论上的。其实很多虚拟机都是在数组里面加了一些字符,所以实际值达不到那么多。另外,我们在ArrayList中也可以看到这个验证,这里定义的最大值是Integer.MAX_VALUE-8;而不是直接使用最大值。另外,上面说的最大值是建立在我们的虚拟机有这么大内存的前提下的。如果我们虚拟机配置的内存比这个小,就达不到这么大。我们可以通过JVM参数配置虚拟机的内存大小,-Xms512m设置堆内存的初始值。-Xmx1024m设置最大堆内存。下面是阿芬在自己电脑上测试的效果。可以看到一开始提示WhenRequestedarraysizeexceedsVMlimit,因为阿芬电脑内存不够,一直分配失败,无法达到最大值。缩短长度。还有一点要注意,我们这里说的长度是针对英文字符的。如果是中文就没那么长,那么对应中文的字符串会多长呢?