Java中的字符串的最大长度
Java中的字符串的最大长度
看String的源码可以看出来,String实际存储数据的是char value[],数组的长度是int类型,
整数在java中是有限制的,我们通过源码来看看int类型对应的包装类Integer可以看到,其长度最大限制为2^31 -1,那么说明了数组的长度是0~2^31-1,那么计算一下就是(2^31-1 = 2147483647 = 4GB)。但我们开发的时候,也会出现因为字符串过长导致的编译错误:常量字符串过长。这是为什么呢?
对于字符串可以承受的最大长度,要分为2个阶段,一个是编译时期(也就是你代码定义了一个String字符串,String s= "xiaohu"),一个是运行时期(指在程序运行过程中)。
当String为常量时
这时候,JDK编译期是对String字符串存在限制的,我们都知道JVM里面是包含常量池的,(是一种对字符串的性能优化,不用反复创建新的字符串了)当我们使用字符串字面量直接定义String的时候,是会把字符串在常量池中存储一份的。常量池中的每一项常量都是一个表,都有自己对应的类型。Java中的UTF-8编码的Unicode字符串在常量池中以CONSTANT_Utf8_info类型表,结构如下:
u2类型的length的值就表明了这个UTF-8编码字符串长度是多少字节。
所以CONSTANT_Utf8_info型常量对应的最大长度也就是java中UTF-8编码的字符串的长度,顺便提一下Class文件中的方法和字段也是引用CONSTANT_Utf8_info型常量来描述名称的。u2是无符号的16位整数,因此理论上允许的的最大长度是2^16-1=65535。
总结一下:在Javac编译器下,字符串String的最大长度限制也即是U2类型所能表达的最大长度65534。避开javac最大长度是65535?
当String为变量时
String内部是以char数组的形式存储,数组的长度是int类型,那么String允许的最大长度就是Integer.MAX_VALUE了。又由于java中的字符是以16位存储的,因此大概需要4GB的内存才能存储最大长度的字符串。
总结
首先字符串的内容是由一个字符数组 char[] 来存储的,由于数组的长度及索引是整数,且String类中返回字符串长度的方法length() 的返回值也是int ,所以通过查看java源码中的类Integer我们可以看到Integer的最大范围是2^31 -1,由于数组是从0开始的,所以数组的最大长度可以使【0~2^31】通过计算是大概4GB。
但是通过翻阅java虚拟机手册对class文件格式的定义以及常量池中对String类型的结构体定义我们可以知道对于索引定义了u2,就是无符号占2个字节,2个字节可以表示的最大范围是2^16 -1 = 65535。
其实是65535,但是由于JVM需要1个字节表示结束指令,所以这个范围就为65534了。超出这个范围在编译时期是会报错的,但是运行时拼接或者赋值的话范围是在整形的最大范围。
Eclise编译超过65534长度的字符串不报错,是Eclipse有自己的Java编译器。JDT优化为了StringBuilder的append。
Eclise使用自己的编译器。主要原因是JDT核心具有渐进式编译的能力,这意味着它会逐步编译代码中的更改(这也是Eclipse不需要编译按钮的原因,因为它会在检测到更改时自动编译)。但Oracle的JDK不支持增量编译。
相关文章
- 怎么用命令提示符运行JAVA代码_java命令提示符如何进入
- java字符串的拆分_Java中的字符串分割 .
- java编译命令是什么_Java编译命令整理
- 说一下java的运行机制_Java运行机制是什么?「建议收藏」
- java.util.scanner sc_Java的Scanner sc=new Scanner(System.in)是什么意思「建议收藏」
- MySQL字段类型如何转为java_Java JDBC中,MySQL字段类型到JAVA类型的转换
- Java集合汇总篇「建议收藏」
- java如何输入字符串_JAVA中怎样输入字符串「建议收藏」
- 【说站】java中UDP接收数据的步骤
- 【说站】java语言的特点有哪些
- java复杂对象转json字符串_java处理json数据
- JAVA异或加密「建议收藏」
- java查找字符的方法_Java字符串查找(3种方法)
- 哈夫曼树 编码-哈夫曼树原理及Java编码实现
- java基于ssm的个人博客系统个人博客网站个人博客项目源码
- Java线程池工具类Executors
- java 中旋转一个图片详解编程语言
- 在java代码中执行js脚本,实现计算出字符串“(1+2)*(1+3)”的结果详解编程语言
- 版本配置Linux系统的默认Java版本(linux默认java)
- 机制Redis Java: Expert Solutions for Expiration Mechanism(redisjava过期)
- 处理Java处理Redis过期键的最佳实践(redisjava过期)
- 时间Java实现Redis过期时间控制(redisjava过期)
- 使用Redis存储Java对象(redis存java对象)
- Java操作Redis实现数据快速存取(java访问redis)
- 从字符串中截取等长字节的Java代码