黑马程序员技术交流社区

标题: Java中String类型有没有长度的限制? [打印本页]

作者: laoyang    时间: 2011-10-27 16:50
标题: Java中String类型有没有长度的限制?
本帖最后由 laoyang 于 2011-11-21 10:53 编辑

求解:Java中String类型有没有长度的限制?如果有,限制是多少?
作者: 杨杰    时间: 2011-10-27 17:06
查看String的源代码我们可以得知类String中是使用域 count 来记录对象字符的数量,而count 的类型为 int,因此,我们可以推测最长的长度为 2^32,也就是4G。

  不过,我们在编写源代码的时候,如果使用 Sting str = "aaaa";的形式定义一个字符串,那么双引号里面的ASCII字符最多只能有 65534 个。为什么呢?因为在class文件的规范中, CONSTANT_Utf8_info表中使用一个16位的无符号整数来记录字符串的长度的,最多能表示 65536个字节,而java class 文件是使用一种变体UTF-8格式来存放字符的,null值使用两个字节来表示,因此只剩下 65536- 2 = 65534个字节。也正是变体UTF-8的原因,如果字符串中含有中文等非ASCII字符,那么双引号中字符的数量会更少(一个中文字符占用三个字节)。如果超出这个数量,在编译的时候编译器会报错。
作者: 吉许    时间: 2011-10-27 17:10
这问题真没考虑过,应该没有限制的吧.我觉得只要内存装得下应该都可以,但一想字符串是由字符数组char[]组成的.数组的角标是整型的.所以String的长度不能超过规定它的整型的长度. 有高人来给个解释没.
作者: 董浩    时间: 2011-10-27 18:17
应该受限于两个条件
一、Integer.MAX_VALUE
二、jvm可用内存
作者: 王维波    时间: 2011-10-28 15:25
web中传值没有限定大小,都是根据实际情况操作的,这与计算机有一定的关系。
作者: 肖居上    时间: 2011-10-28 21:40
严格来说,String确实有长度限制。
String内部使用一个char[]数组来存放字符串的内容,数组下标是整型(也可以参考String的构造方法String(char value[], int offset, int count) ,可以知道字符数量是用整型表示),整型(Java规定32位)表示范围是2G,也就是说,Java数组最大的长度是2G,即字符串不能超过2G个字符。
Java的数组大小还有没有别的限制?事实上数组大小不能超过Java堆的大小,而Java堆的最大尺寸可以通过启动参数指定,如果Java堆开得足够大,数组的最大长度是可以不断增大的。
所以,理论上,字符串不能超过2G个字符,少于2G个字符都有可能。
但编码时有需要注意的地方,采用明文的方式,如果超过65534个字节,可能报编译错误,可参考下列网站(有一处错误,整型考虑到符号位,最大只到2G)。
作者: 咖啡    时间: 2011-10-29 22:53
应该有关系,内存是其中的一个,其它的我不是太了解。
作者: 邱本超老师    时间: 2011-10-30 12:58
用string.getBytes().length就可以解决了哈哈




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2