转自:String字符串的最大长度是多少?在学习和开发过程中,我们经常会讨论 short ,int 和 long 这些基本数据类型的取值范围,但是对于 String 类型我们好像很少注意它的“取值范围”。那么对于 String 类型,它到底有没有长度限制呢?

其实 String 类型的对象,他们是有长度限制的, String 对象并不能“存储”无限长度的字符串。关于 String 的长度限制要从编译时限制运行时限制两方面考虑。

编译期限制

有JVM虚拟机相关知识的同学肯定知道,下面定义的字符串常量“自由之路”会被放入方法区的常量池中。

String s = "自由之路";
System.out.println(s);

Stirng 长度之所以会受限制,是因JVM规范对常量池有所限制。常量池中的每一种数据项都有自己的类型。Java中的UTF-8编码的Unicode字符串在常量池中以CONSTANT_Utf8类型表示。

CONSTANT_Utf8的数据结构如下:

CONSTANT_Utf8_info {u1 tag;u2 length;u1 bytes[length];
}

我们重点关注下长度为 length 的那个bytes数组,这个数组就是真正存储常量数据的地方,而 length 就是数组可以存储的最大字节数。length 的类型是u2,u2是无符号的16位整数,因此理论上允许的的最大长度是2^16-1=65535。所以上面byte数组的最大长度可以是65535。

//65535个d,编译报错
String s = "dd..dd";//65534个d,编译通过
String s1 = "dd..d";

上面的列子中长度为65535的字符串s还是编译失败了,但是长度为65534的字符串 s1 编译是成功的。这个好像和我们刚刚的结论不符合。

其实,这是Javac编译器的额外限制。在Javac的源代码中可以找到以下代码:

private void checkStringConstant(DiagnosticPosition var1, Object var2) {if (this.nerrs == 0 && var2 != null && var2 instanceof String &&   ((String)var2).length() >= 65535) {this.log.error(var1, "limit.string", new Object[0]);++this.nerrs;}
}

代码中可以看出,当参数类型为String,并且长度大于等于65535的时候,就会导致编译失败。

这里需要重点强调下的是:String 的限制还有一个部分,那就是对字符串底层存储的字节数的限制。也就是说:在编译时,一个字符串的长度大于等于65535或者底层存储占用的字节数大于65535时就会报错。这句话可能比较抽象,下面举个列子就清楚了。

Java中的字符常量都是使用UTF8编码的,UTF8编码使用1~4个字节来表示具体的Unicode字符。所以有的字符占用一个字节,而我们平时所用的大部分中文都需要3个字节来存储。

//65534个字母,编译通过
String s1 = "dd..d";//21845个中文”自“,编译通过
String s2 = "自自...自";//一个英文字母d加上21845个中文”自“,编译失败
String s3 = "d自自...自";

对于s1,一个字母d的UTF8编码占用一个字节,65534字母占用65534个字节,长度是65534,长度和存储都没超过限制,所以可以编译通过。

对于s2,一个中文占用3个字节,21845个正好占用65535个字节,而且字符串长度是21845,长度和存储也都没超过限制,所以可以编译通过。

对于s3,一个英文字母d加上21845个中文”自“占用65536个字节,超过了存储最大限制,编译失败。

运行时限制

String 运行时的限制主要体现在 String 的构造函数上。下面是 String 的一个构造函数:

public String(char value[], int offset, int count) {...
}

上面的count值就是字符串的最大长度。在Java中,int的最大长度是2^31-1。所以在运行时,String 的最大长度是2^31-1。

但是这个也是理论上的长度,实际的长度还要看你JVM的内存。我们来看下,最大的字符串会占用多大的内存。

(2^31-1)*2*16/8/1024/1024/1024 = 4GB

所以在最坏的情况下,一个最大的字符串要占用4GB的内存。如果你的虚拟机不能分配这么多内存的话,会直接报错的。

JDK9以后对String的存储进行了优化。底层不再使用char数组存储字符串,而是使用byte数组。对于LATIN1字符的字符串可以节省一倍的内存空间。

简单总结

String 的长度是有限制的。

  • 编译期的限制:字符串的UTF8编码值的字节数不能超过65535,字符串的长度不能超过65534;
  • 运行时限制:字符串的长度不能超过2^31-1,占用的内存数不能超过虚拟机能够提供的最大值。

String字符串的最大长度是多少?相关推荐

  1. 【Java】String字符串的最大长度是多少?

    先说结论: 对于Java字符串的最大长度,要分为2种情况进行讨论. ① 编译期:一般情况下,最大长度为65534. ② 运行期:Integer.MAX_VALUE. 接下来通过对一个字节码文件反编译来 ...

  2. 关于Java的String字符串常量的长度问题(Error:(14, 22) java: 常量字符串过长)

    虽然这种问题应该很难遇到,但是遇到了也会感到莫名其妙.不知道大家有没有遇到那种在java代码里用字符串写sql语句的情况,但是如果sql语句字符串的长度太长的话就会报错. 代码如下: 代码A Stri ...

  3. java字符串长度_Java中String字符串的最大长度?

    1.Java中的字符串String最大长度,编译期如果是javac编译就是65534.如果绕过javac编译的限制,其最大长度可以达到u2类型变达的最大值65535. Oracle JDK的编译工具J ...

  4. String字符串按照指定长度进行分割,并生成新的字符串

    你还有更简单的方法吗? String regex = "(.{12})";//其中的12表示按照每12位进行分割 String itemName = "中国铁路乌鲁局集团 ...

  5. Java的socket连接以及string字符串长度过长解决

    一.socket连接服务: 1.客户端:Java package cn.lw;import java.io.BufferedReader; import java.io.BufferedWriter; ...

  6. Java String字符串长度不足指定位数补0

    Java String字符串长度不足指定位数补0 自己项目中有个需求:需要5位随机数-范围在1-99999 随机数可以利用Random()来获取,但是想要生成的随机数都是5位数,那就需要做一点小处理啦 ...

  7. String字符串的长度

    最近回顾了一下String的长度,记录一下, 万一下次忘了方便再次记忆! Java中的String的长度要要分两个阶段去思考: 1.编译期: 在JDK1.8中,看过String的源码的应该知道,根据p ...

  8. java string 最大长度是多少_String字符串的最大长度是多少?

    在学习和开发过程中,我们经常会讨论 short ,int 和 long 这些基本数据类型的取值范围,但是对于 String 类型我们好像很少注意它的"取值范围".那么对于 Stri ...

  9. java基础-String字符串字符长度校验

    java基础-String字符串字符长度校验 /*** 校验字符串是否在规定字符数内* @param str* @param maxLength* @return*/ public static bo ...

最新文章

  1. 限制TextBox输入的内容
  2. python小数输出01_python:格式化输出(上)
  3. ap计算机科学4分还要再考吗,CB官方发布2020年AP计算机科学考试(CSA)的细节:考试时间/考试题型/备考资料/评分标准/考前建议...
  4. 国产数据库 OceanBase 二次刷榜 TPC-C,7 亿 tpmC!
  5. 【codevs2304】【BZOJ1875】HH去散步,第一次的矩阵加速DP
  6. 六个建议防止SQL注入式攻击
  7. 用JavaScript实现用户登录验证、注册信息格式检验(附代码)
  8. 人工智能发展月报(2022年6月)
  9. 06 第五章 一阶逻辑等值演算与推理
  10. 浮山中学2021年高考成绩查询入口,浮山中学2019年高考成绩通报,第二波震撼来袭...
  11. d3js绘制y坐标轴_如何用D3绘制各类样式的x坐标轴
  12. linux 删除文件名带括号的文件
  13. 上海七宝惊现海宝美眉
  14. 有哪些生物多样性保护项目?
  15. 猫哥的 2021 年终总结 - 焦虑与破局
  16. object标签属性详解
  17. 2023新春版:看这篇大宝典就够了!从零搭建React项目全家桶
  18. Go环境搭建和GoLand安装
  19. 各个段位 毕业要准备几篇论文,毕业太难了。
  20. linux防火墙 33001端口,Linux防火墙基础试题-firewalld

热门文章

  1. 【PYTHON小项目】VCF文件转EXCEL文件方法详解(附QUOTED-PRINTABLE编解码)
  2. 伯乐识英才,我们招聘啦!
  3. layUI 表格中1:0转换成男女 if else数字转对应中文显示
  4. 街景窗户检测数据集(Street Scene Window Detection (SSWD))-VOC和Yolo版本
  5. 趋肤效应和铜皮粗糙度关系以及带来导线损耗影响
  6. 怎样让git不用每次输入密码_请问如何解决git pull/push每次都要输入密码的问题?...
  7. dive into python 3_对象方法Dive into Python读书笔记3
  8. 用“视觉”确保品质——IC芯片质量检测
  9. 按下开机键,风扇都不转,吾是怎样复活电脑的?
  10. Android学习之如何集成极光IM功能(一)