A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© laoyang 黑马帝   /  2011-10-27 16:50  /  20758 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 laoyang 于 2011-11-21 10:53 编辑

求解:Java中String类型有没有长度的限制?如果有,限制是多少?

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
杨杰 黑马帝 2011-10-27 17:06:51
沙发
查看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字符,那么双引号中字符的数量会更少(一个中文字符占用三个字节)。如果超出这个数量,在编译的时候编译器会报错。

评分

参与人数 2技术分 +3 收起 理由
杨玉揆 + 1 赞一个!
宁超 + 2 学习了。

查看全部评分

回复 使用道具 举报
吉许 黑马帝 2011-10-27 17:10:31
藤椅
这问题真没考虑过,应该没有限制的吧.我觉得只要内存装得下应该都可以,但一想字符串是由字符数组char[]组成的.数组的角标是整型的.所以String的长度不能超过规定它的整型的长度. 有高人来给个解释没.

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 期待答案。

查看全部评分

回复 使用道具 举报
董浩 黑马帝 2011-10-27 18:17:54
板凳
应该受限于两个条件
一、Integer.MAX_VALUE
二、jvm可用内存

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
web中传值没有限定大小,都是根据实际情况操作的,这与计算机有一定的关系。
回复 使用道具 举报
严格来说,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)。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
咖啡 黑马帝 2011-10-29 22:53:42
7#
应该有关系,内存是其中的一个,其它的我不是太了解。
回复 使用道具 举报
用string.getBytes().length就可以解决了哈哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马