String的长度限制

2023-05-16

String的长度 是有限制的。

String存储

String其实是使用的一个char类型的数组来存储字符串中的字符的。
看看字符串返回长度的方法
字符串长度
返回值类型是int类型
其长度最大限制为2^31 -1, 那么说明了数组的长度是0~2^31-1, 那么计算一下就是(2^31-1 = 2147483647 = 4GB) --------21亿左右

  • jvm规范

JVM在编译时,如果我们将字符串定义成了字面量的形式,编译时JVM是会将其存放在常量池中,这时候JVM对这个常量池存储String类型做出了限制

在这里插入图片描述

常量池中,每个 cp_info 项的格式必须相同,它们都以一个表示 cp_info 类型的单字节 “tag”项开头。后面 info[]项的内容 由tag 的类型所决定。
在这里插入图片描述

在这里插入图片描述
class文件中u2表示的是无符号数占2个字节单位,我们知道1个字节占8位,2个字节就是16位 ,那么2个字节能表示的范围就是2^16- 1 = 65535 。 范中class文件格式对u1、u2的定义的解释做了一下摘要:

这里对java虚拟机规摘要部分

1、class文件中文件内容类型解释

定义一组私有数据类型来表示 Class 文件的内容,它们包括 u1,u2 和 u4,分别代

表了 1、2 和 4 个字节的无符号数。

每个 Class 文件都是由 8 字节为单位的字节流组成,所有的 16 位、32 位和 64 位长度的数

据将被构造成 2 个、4 个和 8 个 8 字节单位来表示。

2、程序异常处理的有效范围解释

start_pc 和 end_pc 两项的值表明了异常处理器在 code[]数组中的有效范围。

start_pc 必须是对当前 code[]数组中某一指令的操作码的有效索引,end_pc 要

么是对当前 code[]数组中某一指令的操作码的有效索引,要么等于 code_length

的值,即当前 code[]数组的长度。start_pc 的值必须比 end_pc 小。

当程序计数器在范围[start_pc, end_pc)内时,异常处理器就将生效。即设 x 为

异常句柄的有效范围内的值,x 满足:start_pc ≤ x < end_pc。

实际上,end_pc 值本身不属于异常处理器的有效范围这点属于 Java 虚拟机历史上

的一个设计缺陷:如果 Java 虚拟机中的一个方法的 code 属性的长度刚好是 65535

个字节,并且以一个 1 个字节长度的指令结束,那么这条指令将不能被异常处理器

所处理。不过编译器可以通过限制任何方法、实例初始化方法或类初始化方法的

code[]数组最大长度为 65534,这样可以间接弥补这个 BUG。

总结

首先字符串的内容是由一个字符数组 char[] 来存储的,由于数组的长度及索引是整数,且String类中返回字符串长度的方法length() 的返回值也是int ,所以通过查看java源码中的类Integer我们可以看到Integer的最大范围是2^31 -1,由于数组是从0开始的,所以数组的最大长度可以使【0~2^31-1】通过计算是大概4GB。

但是通过翻阅java虚拟机手册对class文件格式的定义以及常量池中对String类型的结构体定义我们可以知道对于索引定义了u2,就是无符号占2个字节,2个字节可以表示的最大范围是2^16 -1 = 65535。

其实是65535,但是由于JVM需要1个字节表示结束指令,所以这个范围就为65534了。超出这个范围在编译时期是会报错的,但是运行时拼接或者赋值的话范围是在整形的最大范围。

  1. 常量字符串最大65534 字节
  2. 拼接时字符串最大【0~2^31-1】 4GB(21亿字节)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

String的长度限制 的相关文章

  • 如何使用 grep 查找文件夹内的单词?

    在 Windows 中 我会进行搜索以在文件夹中查找单词 同样 我想知道某个特定单词是否出现在包含许多子目录和文件的目录中 我对 grep 语法的搜索显示我必须指定文件名 即grep string filename Now I do not
  • Java 中的字符串拆分:可变长度的前向和后向

    我想使用数字作为分隔符来破坏 Java 中的字符串 但保留数字 一些研究表明 使用 String 中的 split method 是合适的 但我不明白如何做到这一点 为了进一步解释我的问题 我将使用一个例子 Input 20 55 50 0
  • 连接空字符串来进行字符串转换真的那么糟糕吗?

    假设我有两个char变量 稍后我想将它们连接成一个字符串 我就是这样做的 char c1 c2 String s c1 c2 我见过有人说 trick 是 丑陋的 等等 你应该使用String valueOf or Character to
  • 为什么 Go 中无法将 [Size]byte 转换为字符串?

    我有一个大小字节数组 是我做完之后得到的md5 Sum data byte testing var pass string var b 16 byte b md5 Sum data pass string b 错误 cannot conve
  • 转义 C++ 字符串

    将 C std string 转换为另一个 std string 的最简单方法是什么 它转义了所有不可打印的字符 例如 对于两个字符的字符串 0x61 0x01 结果字符串可能是 a x01 或 a 01 看看Boost的字符串算法库 ht
  • 无法解析 Android 资源字符串

    我正在学习 Android 我遇到了一个我认为很奇怪的问题 在 res values strings xml 我有
  • 如何在 Rust 中删除字符串的第一个和最后一个字符?

    我想知道如何删除 Rust 中字符串的第一个和最后一个字符 Example Input Hello World Output ello Worl 您可以使用 chars 迭代器并忽略第一个和最后一个字符 fn rem first and l
  • Java 相当于 C# 中带有 @ 的逐字字符串

    快问 Java 中是否存在应用于字符串的 等效项 例如我可以做 c afolder afile 在 C 中 让它在处理时忽略转义字符 而不必这样做 c afolder aFile Java 有等效的吗 嗯 stackoverflow 正在逃
  • 如何格式化字符串以在 Python 中使用 mysqldb 进行查询?

    我该如何正确执行此操作 我想做这样的查询 query SELECT FROM sometable order by s s limit s s conn app globals pool connection cur conn cursor
  • 将 linq 查询转换为字符串数组 - C#

    将单列 linq 查询转换为字符串数组的最有效方法是什么 private string WordList DataContext db new DataContext var list from x in db Words orderby
  • 字符串包含相同的字符但仍然不同[重复]

    这个问题在这里已经有答案了 我正在尝试读取一个 txt 文件并使用每个句子作为团队的名称 同时使用该名称查找另一个 txt 文件以获取其内容 所有 txt 文件都位于我的资产文件夹的根目录中 第一个 txt 文件工作正常 我使用assetm
  • 为什么不能使用 String.Empty 作为默认参数值?

    今天我在构造函数中创建默认参数值 public SomeClass String something String Empty 编译器抱怨道 something 的默认参数值必须是编译时的 持续的 我的印象是 String 类上的 Empt
  • Go 中的格式错误 - %s %v 或 %w

    s v and w可用于格式化 Go 中的错误 将它们转换为字符串 fmt Errorf 它们在 Go 自己的工具中的使用方式似乎有所不同 In cmd go internal get path go https github com go
  • 比较字符变量

    我想在 R Studio 中比较两个不同的字符变量 第一列 BZ Pred 显示参与者预测的 5 个最常用的应用程序 第二列 BZ Act 显示实际使用最多的 5 个应用程序 现在我想创建第三列 如果第一个应用程序被正确猜测 则包含 是 如
  • python 拆分而不创建空白

    我明白为什么使用 split 创建空白很重要 这要归功于这个问题 https stackoverflow com questions 2197451 why are empty strings returned in split resul
  • 字符串中的换行符未写入文件

    我正在尝试编写一个程序来操作从文件中读取的 unicode 字符串 我想到了两种方法 一种方法是读取包含换行符的整个文件 执行几个正则表达式替换 然后将其写回另一个文件 另一种方法是读取包含换行符的整个文件 执行几个正则表达式替换 然后将其
  • AttributeError:尝试删除字符时,“列表”对象没有属性“替换”

    我试图通过执行以下操作从字符串中删除字符 kickoff tree xpath id page div 1 div main div article div div 1 section 2 p 1 b 1 text kickoff kick
  • JavaScript 中检查变量是否为字符串

    JavaScript 中如何确定变量是字符串还是其他内容 这对我有用 if typeof myVar string myVar instanceof String it s a string else it s something else
  • C# 从字符串中删除 URL

    这看起来非常简单 但我尝试的一切似乎都不起作用 假设我有以下字符串 string myString http www mysite com folder file jpg 我该如何处理它以删除 URL 并仅保留 file jpg 作为字符串
  • 将 KB/MB/GB 等字符串解析为数值

    为了不发明自行车 我想知道是否有任何库能够将大小字符串 MB KB TB MiB KiB 等 的各种表示形式解析为基于数字字节的值 ActiveState Receipes 有一个示例here http code activestate c

随机推荐

  • 14.数据成员属性

    目录 1 静态属性 xff1a 2 类中的静态成员 xff1a 3 类中的静态函数 xff1a 4 类中的const成员5 类中的常量成员6 类中的常量函数 xff1a 7 常量对象 xff1a 1 静态属性 xff1a 回顾C语言的静态变
  • 15.异常处理

    目录 1 为什么需要异常处理 xff1f 2 在c 43 43 中异常处理的方法 xff1f xff1f 3 异常的抛出4 异常的类型捕捉5 系统预定义的异常类型6 异常的再抛出 1 为什么需要异常处理 xff1f 用 new 运算符动态分
  • 我的创作纪念日

    一周年纪念
  • SD卡无法格式化怎么办的解决方法

    SD卡无法格式化怎么办的解决方法 http www upantool com jiaocheng neicunka 5399 html 每次SD卡受损都要格卡的朋友 xff0c 一大堆游戏 相片 视频 xff0c 还有导航地图要重新上传 x
  • cmake --Cannot specify link libraries for target" XX" which is not built by this project.

    cmake Cannot specify link libraries for target 34 XX 34 which is not built by this project 原CMakeLists txt内容 xff1a find
  • cmake & CMakeLists.txt

    文章目录 前言先从体验开始1 一个最简单的例子 xff1a 2 例子升级 xff0c 将hello c生成为一个库 xff1a 3 例子升级 xff0c 将源代码和库分开放 xff1a 4 让可执行文件在 bin 目录 xff0c 库文件在
  • 配置Jetson XAVIER NX串口通信,不使用union传递浮点数

    下载minicom span class token function sudo span span class token function apt get span span class token function install s
  • C语言实现大写字母与小写字母之间的互转

    思路 咋一看 xff0c 好像没什么思路 其实我们只需要知道ASCII值就行 xff0c 65和97这两个数字作为程序员必须牢记于心 xff0c 因为这两个数字分别是ASCII表中字母 a 和 A 的十进制值 xff01 xff01 xff
  • 实时显示电脑当前网速和CPU利用率等信息 && 设置软件开机自启动

    相信不少朋友在平时看实时网速时 xff0c 用的都是360那个悬浮窗 xff0c 或者其它杀毒软件提供的 而今天就介绍一款绿 xff08 逼 xff09 色 xff08 格 xff09 更高的用于显示当前网速 CPU及内存利用率的桌面悬浮窗
  • Win10只能安装GPT磁盘的解决办法

    最近帮同事重装系统时 xff0c 遇到了之前没遇到过的问题 无论是微软官方的U盘制作工具还是MSDN下载的镜像加上rufus都无法解决的问题 xff0c 那就是在选择安装磁盘时会提示无法安装 xff0c 点击错误详细会出现下面的提示框 xf
  • C语言中常用运算符

    C语言中常用到的运算符主要有算数运算符 逻辑运算符 位运算发 关系运算符和其它的 一 算数运算符 主要是我们在数学运算中使用的一些加减乘除运算符 xff0c 但是有几个运算符与我们数学中的不 太一样 xff08 以下会说明 xff09 xf
  • 如何下载Ubuntu 20.04并运行在VM虚拟机上

    第一步 下载Ubuntu镜像文件 下载Ubuntu的镜像 xff0c 我们首先想到的就是去官网下载 xff0c 但是由于服务器在国外 xff0c 下载速度可能只有几KB S 甚至压根就下载不了 其实我们有更好的选择 那就是选择我们国内的一些
  • Unbutntu18.04 caffe在make编译时出现对‘cv::imread(cv::String const&, int)’未定义的引用 解决方案

    在CAFFE编译时会出现如下错误 xff1a CXX LD o build release tools caffe bin build release lib libcaffe so xff1a 对 cv imread cv String
  • yolov5返回坐标

    yolov5返回坐标 yolov5目前已更新到v6版 xff0c 上面up主的文章是以前的版本 xff0c 代码对应不上 xff0c 所以特地在此更新一下 xff1a 参考链接 xff1a https blog csdn net weixi
  • ISD9160学习笔记02_搭建NuMicro开发环境

    http blog csdn net iotisan article details 53166357 所谓学习笔记 xff0c 不能免俗地总会讲到开发环境 嵌入式这一行就是这样 xff0c 每做一个新方案 xff0c 就得学习它的CPU
  • RS232不能通信的问题

    RS232不能通信 xff0c 根据PCB图检查了硬件电路是否导通 xff0c 短路状态使用串口工具发送消息收到消息可以收发 xff0c 编程方面大概率无误 由原理图可见 xff0c 地 TXD和RXD设计错误 xff0c 没有反着接 用杜
  • NRF24L01+实现一对一数据双向传输

    NRF24L01 43 实现一对一数据双向传输 目录说明带负载数据ACK的双向通信配置NRF24L01 43 的收发程序收发双方数据的处理测试代码和结果 目录 说明 最近在diy四轴飞行器的时候 xff0c 需要实现四轴和遥控器之间的双向通
  • RT-Thread开启串口.中断和DMA接收(手把手教学)

    1 串口介绍 串口是指数据一位一位地顺序传送 xff0c 其特点是通讯线路简单 xff0c 只要一对传输线就可以实现双向通信 xff08 可以直接利用电话线作为传输线 xff09 xff0c 从而大大降低了成本 xff0c 特别适用于远距离
  • stm32使用MPU6050读取温度值验证I2C

    通过MPU6050测温来进行I2C的验证学习 关于MPU6050寄存器相关可以参考https blog csdn net he yuan article details 76559569 I2C时序很多 xff0c 我是直接以原子I2C的程
  • String的长度限制

    String的长度 是有限制的 String存储 String其实是使用的一个char类型的数组来存储字符串中的字符的 看看字符串返回长度的方法 返回值类型是int类型 其长度最大限制为2 31 1 xff0c 那么说明了数组的长度是0 2