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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python股票分析挖掘预测技术指标知识跳空缺口指标详解(5)

本人股市多年的老韭菜&#xff0c;各种股票分析书籍&#xff0c;技术指标书籍阅历无数&#xff0c;萌发想法&#xff0c;何不自己开发个股票预测分析软件&#xff0c;选择python因为够强大&#xff0c;它提供了很多高效便捷的数据分析工具包。 我们已经初步的接触与学习其中数…

Next.js 学习笔记(五)——渲染

渲染 渲染将你编写的代码转换到用户界面。React 和 Next.js 允许你创建混合 web 应用程序&#xff0c;其中部分代码可以在服务器或客户端上呈现。本节将帮助你了解这些渲染环境、策略和运行时之间的差异。 基本知识 首先&#xff0c;下列对熟悉三个基本的网络概念是有帮助的…

哈希-力扣454.四数相加Ⅱ

题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;nums1 [1…

UI功能6大流程、接口测试8大流程这些你真的全会了吗?

在讲接口流程测试之前&#xff0c;首先需要给大家申明下&#xff1a;接口测试对于测试人员而言&#xff0c;非常非常重要&#xff0c;懂功能测试接口测试&#xff0c;就能在企业中拿到一份非常不错的薪资。 这么重要的接口测试&#xff0c;一般也是面试笔试必问。为方便大家更…

Java并发之互斥一:管程

1、简单聊聊什么是管程模型 &#xff08;共享资源&#xff09;&#xff1a;定义一个共享变量&#xff0c;可以理解锁&#xff0c;令牌这类的东西&#xff08;互斥访问共享资源&#xff09;&#xff1a;获取这个锁、令牌的时候是排好队的&#xff0c;只允许单线程访问&#xff…

LeetCode刷题---最小栈

解题思路&#xff1a; 该题通过辅助栈的方式来解决 定义数据栈(用于实现正常操作流程)和辅助栈(用于获取最小元素)。 push:首先将数据push进数据栈中&#xff0c;此时再判断辅助栈是否为空或者当前数据是否小于辅助栈中的最小元素(栈顶元素)&#xff0c;如果条件成立&#xff0…

什么是广告联盟?国内哪些广告联盟?广告联盟如何赚取收益?

开发者想要对接广告联盟获得广告变现收益&#xff0c;就要了解广告联盟的优势&#xff0c;以及广告联盟是如何获取收益的。 一、什么是广告联盟&#xff1f; 广告联盟是一种在线广告服务模式&#xff0c;将广告主和流量主联系在一起。通过广告联盟平台的技术服务&#xff0c;…

用友U8流程审批效率-SQLServer+SSRS

文章目录 @[TOC]1、 需求及效果1.1 需求1.2 效果2、 思路及SQL语句3、实现折叠明细表4、结语1、 需求及效果 1.1 需求 想要查看U8的审批流程,查看流程在哪个节点或人停留的时间,这个单据整个流程走下来需要的时间。可以更加直观方便的查看审批效率 1.2 效果 采用了SSRS上…

NLP论文阅读记录 - wos | 01 使用深度学习对资源匮乏的语言进行抽象文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 Abstractive text summarization of lowresourced languages usi…

企业级进销存管理系统

框架&#xff1a; 进销存管理系统&#xff0c;采用SpringBootShiroMyBatisEasyUI 项目采用Maven构建&#xff0c;数据库文件存放在 sql/jxc.sql 截图 运行项目部分截图&#xff0c; 登录界面&#xff0c;用户名admin&#xff0c;密码admin123 当前库存查询&#xff0c; 进…

C/C++ 堆排序

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;数据结构_仍有未知等待探索的博客-CSDN博客 欢迎大家来指教&#xff01; 一、前言 今天要介绍的是堆排序。 首先什么是堆&#xff1f;简而言之&#xff0c;堆就是二叉树的数组形式&#xff0c;用数组来存…

c++最值查找

目录 min和max函数 min_element和max_element 例 nth_element函数 例 例题 题目描述 输入描述 输出描述 解 min和max函数 只能传入两个值或一个列表 时间复杂度为O(1),数组O(n)&#xff0c;n为元素个数 min_element和max_element min_element(st,ed)返回地址[st,…

企业泛域名SSL证书

SSL数字证书是一种电子证书&#xff0c;它由CA认证机构颁发&#xff0c;提供了加密连接和身份验证的功能。SSL数字证书广泛应用于各种在线服务&#xff0c;如网页浏览、电子邮件、在线银行等。它能够提供安全的连接&#xff0c;保护用户的个人信息和交易数据不被窃取或篡改。企…

如果你还忍受校园网,那么一定要看它!随身WiFi哪个品牌最靠谱 ?高人气随身WiFi第一名

很多学生党反映校园网价格太贵&#xff0c;贵就算了&#xff0c;还非常不好用&#xff0c;真的很泪崩。 对于学生党来说&#xff0c;一个性价比极高的随身WiFi才是正正好。 但是很多学生党对随身WiFi并不了解&#xff0c;那么下面我就回答几个学生党最关心的问题。一、价格合…

JVM类加载器打破双亲委派机制

欢迎大家关注我的微信公众号&#xff1a; 传送门&#xff1a;从JDK源码级别剖析JVM类加载器 目录 打破双亲委派机制 Tomcat打破双亲委派机制 Tomcat自定义加载器详解 模拟实现Tomcat打破双亲委派 上一篇文章讲到了jvm类加载器的双亲委派机制&#xff0c;本文就来讲…

探索 hasOwnProperty:处理对象属性的关键(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

IntelliJ IDEA Java 连接 mysql 配置(附完整 demo)

下载 MySQL 驱动 从MySQL官网下载JDBC驱动的步骤如下&#xff1a; 1&#xff09;访问MySQL的官方网站&#xff1a;MySQL 2&#xff09;点击页面上方的"DOWNLOADS"菜单&#xff1b; 3&#xff09;在下载页面&#xff0c;找到"MySQL Community (GPL) Downloads…

人工智能推动供应链革命的成功

人工智能推动供应链革命的成功 目录 人工智能推动供应链革命的成功一、供应链管理不断变化的面貌二、拥挤的解决方案景观三、踏上人工智能驱动的转型1. 价值创造识别、战略和路线图2. 目标解决方案设计和供应商选择3. 实施与系统集成4. 变革管理、能力建设和全面价值获取 新技术…

MySQL-索引回顾

索引是面试高频问答题&#xff0c;参考百度/CSDN/尚硅谷/黑马程序员/阿里云开发者社区&#xff0c;决定将索引知识回顾一下&#xff0c;忘记时&#xff0c;点开即可&#xff0c;时刻保持更新&#xff0c;事不宜迟&#xff0c;即刻享用。 索引概述 索引&#xff08;index&#…