String有没有最大长度限制?

大家都用过String字符串,有的人可能还不知道它的长度在某些方面是有一些限制。

public String(byte bytes[], int offset, int length);

这是java.lang.String中的一个构造函数,可以看到它的长度是int类型,int的最大取值是2^31-1.但是我们却不能认为String支持的最大长度是这么大,这个长度的范围是JVM在运行期对String的一种限制,并非是编译器定义字符串的时候的限制。因为JVM是有StringTable字符串常量池这个概念的,如果编译器里面允许的最大长度那就是int类型的最大范围,大家知道这意味这什么吗,这意味着一个String字符串可以支持4G长度大小了,这怎么可能允许?

String s = "111111.....1111";// 其中有10万个字符"1";

当执行javac编译时会抛出异常,IDEA会提示你常量字符串过长
你可能很好奇为什么不是int类型的长度限制。这其实跟Java虚拟机规范有关,当我们按照String s= "xxx"的形式定义字符串时,xxx被我们称为字面量,这种字面量在编译之后会以常量的形式进入Class常量池,既然要进入常量池,就需要遵循常量池的有关规定
《Java虚拟机规范》官方链接
https://docs.oracle.com/javase/specs/jvms/se7/html/index.html
根据《Java虚拟机规范》中的4.4节定义,CONSTANT_String_info用于表示java.lang.String类型的常量对象,格式:

CONSTANT_String_info{u1 tag;u2 string_index;
}

其中,string_index项的值必须是对常量池的有效索引,常量池在该索引处的项必须是CONSTANT_Uft8_info结构,表示一组Unicode字符绪列,这组Unicode字符序列最终会被初始化为一个String对象
CONSTANT_Uft8_info结构用于表示字符串常量的值

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

其中length指明了bytes[]数组的长度,其类型为u2
根据《Java虚拟机规范》,u2表示2字节的无符号数,1字节有8位,2字节有16位,而16位无符号数可以表示的最大值为2^16-1=65535
也就是说,Class文件中常量池的格式规定了其字符串常量的长度不能超过65535

String s = "11111...11"; //其中有65535个1

但是编译时,仍然会报错,还是常量字符串过长,有的人可能会说不是说最大时65535吗?为什么这里还会报错,这个原因可以在javac的代码中可以找到Gen类中有如下代码

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;}
}

上面就是编译期的限制了,运行期的限制就是int类型的4GB的大小限制了,我们可以通过以下代码实现

String s ="";
for (int = 0; i < 100000; i++) {s+= "" +i;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/342691.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis 从0到1完整学习 (十七):内存回收之内存淘汰策略

文章目录 1. 引言2. redis 源码下载3. 内存回收策略4. 如何设置内存淘汰策略4.1 在 Redis 配置文件设置&#xff08;推荐重启后生效&#xff09;4.2 运行时动态调整 5. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装…

【java八股文】之MYSQL基础篇

1、数据库三大范式是什么 第一范式&#xff1a;每个列都不可以再拆分。 第二范式&#xff1a;在第一范式的基础上&#xff0c;非主键列完全依赖于主键&#xff0c;而不能是依赖于主键的一部分。 第三范式&#xff1a;在第二范式的基础上&#xff0c;非主键列只依赖于主键&#…

2024 IAA增长变现玩法拆解,NetMarvel提出进阶版攻略!

2023年的国内外市场&#xff0c;很多大甲方都表示消极&#xff0c;字节游戏业务高歌猛进后大撤退更是直接震惊了整个行业&#xff0c;更别说第二第三梯队的服务商了。 动荡和低迷的经济局势还没有消散&#xff0c;这给开发者带来接连不断的挑战。 01 市场反馈是正向的&#x…

VS Code 配置 Vue3 模板 详细步骤

1、打开 VS Code &#xff0c;在页面左下角找到这个设置图标&#xff0c;然后找到 “用户代码片段” 2、接着点击 “新建全局代码片段文件” 3、在输入框中输入你要设置的模板名&#xff0c;然后回车确认 4、接下来配置自己想要模板代码&#xff0c;或者也可以借鉴我写的这个&…

JavaScript(第二篇)浮点数运算精度问题,一网打尽所有相关面试题

前言 本篇文章是《面试题一网打尽》专栏的 javascript 第二篇文章&#xff0c;彻底解决浮点数运算精度相关的面试题目。欢迎大家关注我的这个专栏。 一、IEEE 754 标准 我们经常在文档中看到这个标准感觉是什么高深的东西&#xff0c;其实 IEEE 是一个组织类似公司名称&…

Sublime Text 3配置 Python 开发环境

Sublime Text 3配置 Python 开发环境 一、引言二、主要内容1. 初识 Sublime Text 32. 初识 Python2. 接入 Python2.1 下载2.2 安装和使用 python2.2 环境变量配置 3. 配置 Python 开发环境4. 编写 Python 代码5. 运行 Python 代码 三、总结 一、引言 Python 是一种简洁但功能强…

记录一次数据中包含转义字符\引发的bug

后端返回给前端的数据是: { "bizObj": { "current": 1, "orders": [ ], "pages": 2, "records": [ { "from": "1d85b8a4bd33aaf99adc2e71ef02960e", …

LInux初学之路linux的磁盘分区/远程控制/以及关闭图形界面/查看个人身份

虚拟机磁盘分配 hostname -I 查看ip地址 ssh root虚拟就ip 远程连接 win10之后才有 远程控制重新启动 reboot xshell 使用&#xff08;个人和家庭版 免费去官方下载&#xff09; init 3 关闭界面 减小内存使用空间 init 5 回复图形界面 runlevel显示的是状态 此时和上…

抄代码对提升编程能力有用吗?

我毕业12年&#xff0c;做开发10年&#xff0c;一直用c语言在写程序&#xff0c;编程水平从菜&#xff0c;到能应付各种项目&#xff0c;我可以肯定告诉你&#xff0c;抄代码很有用&#xff0c;新手也只能先从抄开始。 刚开始&#xff0c;啥也不懂&#xff0c;就跟着教程&#…

简单明了,汽车级LM317系列LM317D2TR4G线性电压稳压器电源设计-参数应用方案分享

低压差线性稳压器&#xff08;LDO&#xff09;&#xff0c;是指一种具有恒定电流输出电压的装置&#xff0c;主要由输入变压器、整流器、输出变压器三部分构成&#xff0c;工业原理为将输入的交流电压经过整流、滤波后得到直流输出电压&#xff0c;再经过控制元件和开关器件将稳…

Kali Linux —— 漏洞分析工具

Cisco-torch与Global Exploiter专攻Cisco漏洞 一、Cisco 工具 Kali 有许多工具&#xff0c;比如信息收集工具、密码爆破工具等等&#xff0c;还有一些可用于攻击 Cisco 路由器的工具。Cisco-torch就是这样&#xff0c;用于大规模扫描、指纹识别和利用的工具之一。 打开终端控…

查询速度提升15倍!银联商务基于 Apache Doris 的数据平台升级实践

本文导读&#xff1a; 在长期服务广大规模商户的过程中&#xff0c;银联商务已沉淀了庞大、真实、优质的数据资产数据&#xff0c;这些数据不仅是银联商务开启新增长曲线的基础&#xff0c;更是进一步服务好商户的关键支撑。为更好提供数据服务&#xff0c;银联商务实现了从 H…