Java基础---String的长度限制

news2024/11/26 9:33:49

目录

典型回答

常量池限制

运行期限制


  • 典型回答

  • String有长度限制,编译期和运行期不一样
  • 编译期需要用 CONSTANT_Utf8_info 结构用于表示字符串常量的值,而这个结构是有长度限制,他的限制是65535
  • 运行期,String的length参数是Int类型的,那么也就是说,String定义的时候,最大支持的长度就是int的最大范围值
  • 根据Integer类的定义,java.lang.Integer#MAX_VALUE 的最大值是2^31 - 1;
  • 常量池限制

  • javac是将Java文件编译成class文件的一个命令,那么在Class文件生成过程中,就需要遵守一定的格式
  • 根据《Java虚拟机规范》中第4.4章节常量池的定义,CONSTANT_String_info 用于表示 java.lang.String 类型的常量对象,格式如下:

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

  • 其中,length则指明了bytes[]数组的长度,其类型为u2,通过翻阅《规范》,可以获悉
  • u2表示两个字节的无符号数,那么1个字节有8位,2个字节就有16位
  • 16位无符号数可表示的最大值位2^16 - 1 = 65535
  • 也就是说,Class文件中常量池的格式规定了,其字符串常量的长度不能超过65535
  • 那么尝试使用以下方式定义字符串:

  • 尝试使用javac编译,同样会得到"错误: 常量字符串过长",那么原因是什么呢?
  • 其实,这个原因在javac的代码中是可以找到的,在Gen类中有如下代码:

  • 代码中可以看出,当参数类型为String,并且长度大于等于65535的时候,就会导致编译失败
  • 这个地方可以尝试着debug一下javac的编译过程,也可以发现这个地方会报错
  • 如果尝试以65534个字符定义字符串,则会发现可以正常编译
  • 其实关于这个值,在《Java虚拟机规范》也有过说明:

  • 运行期限制

  • 上面提到的这种String长度的限制是编译期的限制,也就是使用String s= "";
  • 这种字面值方式定义的时候才会有的限制
  • 那么,String在运行期有没有限制呢,答案是有的
  • String类中有很多重载的构造函数,其中有几个是支持用户传入length来执行长度的:

  • 可以看到,这里面的参数length是使用int类型定义的,那么也就是说,String定义的时候,最大支持的长度就是int的最大范围值
  • 根据Integer类的定义,java.lang.Integer#MAX_VALUE 的最大值是2^31 - 1; 这个值约等于4G
  • 在运行期,如果String的长度超过这个范围,就可能会抛出异常
  • (在jdk 1.9之前)int 是一个 32 位变量类型,取正数部分来算的话,他们最长可以有

  • 有近 4G 的容量
  • 可能会有疑惑,编译的时候最大长度都要求小于65535了,运行期怎么会出现大于65535的情况呢
  • 这其实很常见,如以下代码:

  • 得到的字符串长度就有10万,另外在实际应用中遇到过这个问题
  • 一次系统对接,需要传输高清图片,约定的传输方式是对方将图片转成BASE64编码,接收到之后再转成图片
  • 在将BASE64编码后的内容赋值给字符串的时候就抛了异常
  • 后来为了解决这个问题,不再传输图片的BASE64编码内容了,而是先把文件上传到OSS或者FTP中,然后直接传递文件地址

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins 配置用户角色和权限

1、配置条件: 1)已安装Jenkins,当前案例使用版本:2.319.3 2)已成功进入Jenkins,并新建用户:dev_java 2、安装插件【系统管理-插件管理-搜索-可选插件】:Role-based Authoriz…

JavaScript 进阶 - 第4天

JavaScript 进阶 - 第4天笔记 文章目录 JavaScript 进阶 - 第4天笔记1 深浅拷贝1.1 浅拷贝1.2 深拷贝(面试)1.2.1 递归实现深拷贝1.2.2 js库lodash里面cloneDeep内部实现了深拷贝1.2.3 JSON序列化 2 异常处理2.1 throw 抛异常2.2 try ... catch 捕获异常…

Linux之Kafka保姆式详细安装教程

下载Kafka 《Kafka官网下载》 注意:下载的是二进制文件,不要下载源码!这里可以采用第三方下载工具加速下载,如:迅雷等 上传到Linux服务器的/data/目录下进行解压 tar -zxvf是解压文件命令,-C表示把解压…

【C++学习笔记】1.6 引用

目录 🍯1.6 引用 🥝1. 引用的概念 🥝2. 引用的特性 1、引用在定义时必须初始化 2、一个变量可以有多个引用 3、引用一旦引用一个实体,再不能引用其他实体 🥝3. 常引用 1、取别名的原则:对原引用的…

数据查询大揭秘:收好几个模式化公式

欢迎来到数据查询大揭秘!今天,我将与大家分享一些宝贵的秘诀和技巧,让你轻松应对数据查询的挑战。准备好了吗?收起你的笔记本和便签纸,因为我即将为你介绍几个模式化公式,让你事半功倍地完成数据查询任务&a…

湖北文理学院工程能力实训开班!

为深化校企合作,产教融合助力新工科建设,提升学生工程实践能力,电巢工程能力实训班按照不同岗位类别,匹配对应的企业岗位任职能力要求对学生开展分级培养,以产业需求为导向,培养创新型、应用型人才。 7月3…

open3D cmake+win10+vs2019编译

已经采用python版open3D实现和验证了功能,但是在C迁移上却遇到了不少问题: 1、可能是与本地的编译器存在差异,在使用open3D git上的winows版本时,存在地址访问冲突和std::bad_alloc等问题。前者在适用IO读写时必现,后者…

【Git】Windows如何运行.sh脚本文件

在Windows系统中运行.sh脚本需要借助第三方工具,比如Git Bash、Cygwin或WSL(Windows Subsystem for Linux)等。 以下是使用Git Bash运行.sh脚本的步骤: 安装Git Bash:从Git官方网站(https://git-scm.com/…

【Ubuntu学习MySQL——MySQL基本操作命令】

1.创建数据库 2.删除数据库 3.选择数据库 4. 创建数据表 5.删除数据表 6.往数据表中插入数据 7.从数据表中查询数据 SELECT column_name,column_name FROM table_name [WHERE Clause] [LIMIT N][ OFFSET M]""" 查询语句中你可以使用一个或者多个表&#xff0c…

SpringMVC源码-DispatcherServlet

一、SpringMVC请求处理流程 DispatcherServlet:DispatcherServlet是SpringMVC中的前端控制器,负责接收request并将request转发给对应的处理组件。HandlerMapping:HanlerMapping是SpringMVC中完成url到Controller映射的组件。Handler&#xff…

智能汽车时代,产业如何“软硬兼施”

摘要: 智能汽车时代,以车用芯片、基础软件为代表的卡脖子关键技术,牵动着国内整个汽车供应链的安全。“软硬兼施”正成为从企业到汽车全行业的共同重大行动。 汽车产业链、供应链安全问题近两年已经引起全行业前所未有的关注。进入智能汽车时…

互联网医院资质申请难吗|互联网医院+医药机构

互联网医院牌照申请的具体流程可能因国家和地区的法规和政策而有所不同。下面是一个一般性的流程介绍:   准备材料:根据当地的法规和政策要求,准备申请互联网医院牌照所需要的相关材料。这些材料可能包括但不限于:公司注册证明、…

【已解决】cc1plus: fatal error: cuda_runtime.h: No such file or directory

文章目录 前因解决方案后果 前因 我是在conda环境下创建stable diffusion的虚拟环境,虚拟环境下pytorch、cuda和cudnn的版本如下所示。服务器上的CUDA版本是11.2,GPU是P40,内存22G。 import torch >>> torch.__version__ 1.12.0 &…

JavaEE语法第二章之多线程(初阶四)

一、wait 和 notify 由于线程之间是抢占式执行的, 因此线程之间执行的先后顺序难以预知.但是实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序. 球场上的每个运动员都是独立的 "执行流" , 可以认为是一个 "线程". 而完成一个具体的进攻得分…

【数据结构课程设计系列】农夫过河问题操作演示

农夫过河 1、题目要求 1.1设计目的 掌握广度优先搜索策略,并用队列求解农夫过河问题。 1.2设计内容 一个农夫带着一只狼、一只羊和一棵白菜,身处和的南岸,他要把这些东西全部运到北岸,遗憾的是他只有一只小船,小船只能…

从小白到大神之路之学习运维第53天--------tomcat-web应用——————供开发的商城框架

第三阶段基础 时 间:2023年7月5日 参加人:全班人员 内 容: Tomcat应用服务 WEB服务 目录 实验环境:(四台服务器) 安装tomcat服务: NginxTomcat 负载均衡集群部署: 安装ng…

【JavaWeb基础】分层解耦

一、知识点整理 1、IOC与DI入门 1)控制反转: Inversion 0f Control,简称I0C。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。 2)依赖注入: Dependency lnjection,简称DI。容器为应用程序提供运…

vue 访问第三方 跨域, 配置vue.config.js

目录 0 config 文件被修改 一个要重启vscode 配置文件才会生效 1 第一种 (有两种写法) 1.1 配置vue.config.js 1.2 axios 使用 1.3 终端打印 2 第二种方法 --> 错误 --> 没有运行成功 2.1 配置vue.config.js --> 就是api 不被设置成 替换为 / 2.2 axios 使用…

【Linux初阶】理解一切皆文件 文件属性结构体底层 引用记数

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:理解一切皆文件,文件属性结构体底层理解(struct file、引用记数) &#x1…

记一次被通报的挖矿事件应急响应

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 事件背景介绍02 定位挖矿主机03 挖矿主机分析04 入侵路径梳理05 安全加固建议 01 事件背景介绍 某单位被上级单位通报,单位的出口IP和境外IP有异常通信行为,要求进行紧急处置…